Skip to content

Instantly share code, notes, and snippets.

@Josef212
Last active December 19, 2019 09:41
Show Gist options
  • Save Josef212/65c7d17ce47c5c43651cd9bb5d260cb0 to your computer and use it in GitHub Desktop.
Save Josef212/65c7d17ce47c5c43651cd9bb5d260cb0 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;
public class CompileTime
{
private const string RELOAD_TIME_KEY = "AssemblyReloadEventsTime";
private const string COMPILATION_TIME_KEY = "CompileStartTime";
private static Dictionary<string, DateTime> s_compilationStartTimes = new Dictionary<string, DateTime>();
[MenuItem("Tools/List Player Assemblies")]
public static void PrintPlayerAssemblyNames()
{
PrintAssemblyNames(AssembliesType.Player);
}
[MenuItem("Tools/List Editor Assemblies")]
public static void PrintEditorAssemblyNames()
{
PrintAssemblyNames(AssembliesType.Editor);
}
private static void PrintAssemblyNames(AssembliesType type)
{
Debug.Log($"== {type} Assemblies ==");
Assembly[] playerAssemblies = CompilationPipeline.GetAssemblies(type);
foreach (var assembly in playerAssemblies)
{
Debug.Log(assembly.name);
}
}
[InitializeOnLoadMethod]
private static void Init()
{
CompilationPipeline.assemblyCompilationStarted += CompilationPipelineOnAssemblyCompilationStarted;
CompilationPipeline.assemblyCompilationFinished += CompilationPipelineOnAssemblyCompilationFinished;
#if UNITY_2019_1_OR_NEWER
CompilationPipeline.compilationStarted += CompilationStarted;
CompilationPipeline.compilationFinished += CompilationFinished;
#endif
AssemblyReloadEvents.beforeAssemblyReload += OnBeforeReload;
AssemblyReloadEvents.afterAssemblyReload += OnAfterReload;
}
private static void CompilationPipelineOnAssemblyCompilationStarted(string s)
{
s_compilationStartTimes[s] = DateTime.UtcNow;
EditorPrefs.SetString($"CompileStartTime{s}", Convert.ToString(DateTime.UtcNow.Ticks));
}
private static void CompilationPipelineOnAssemblyCompilationFinished(string s, CompilerMessage[] compilerMessages)
{
var startTimeInTicks = EditorPrefs.GetString($"CompileStartTime{s}");
var startTime = new DateTime(Convert.ToInt64(startTimeInTicks));
var compileTime = DateTime.UtcNow - s_compilationStartTimes[s];
Debug.Log($"Compilation Finished {s} ({compileTime.ToString("s\\.fff")}s)");
}
private static void CompilationStarted(object obj)
{
EditorPrefs.SetString(COMPILATION_TIME_KEY, Convert.ToString(DateTime.Now.Ticks));
}
private static void CompilationFinished(object obj)
{
var startTimeInTicks = EditorPrefs.GetString(COMPILATION_TIME_KEY);
var startTime = new DateTime(Convert.ToInt64(startTimeInTicks));
var compileTime = DateTime.Now - startTime;
Debug.Log($"CompilationPipeline Compilation Finished ({compileTime.ToString("s\\.fff")}s)");
}
private static void OnBeforeReload()
{
EditorPrefs.SetString(RELOAD_TIME_KEY, DateTime.UtcNow.ToBinary().ToString());
}
private static void OnAfterReload()
{
var dateBinStr = EditorPrefs.GetString(RELOAD_TIME_KEY);
long dateBin = 0;
if (long.TryParse(dateBinStr, out dateBin))
{
var date = DateTime.FromBinary(dateBin);
var timeSpan = DateTime.UtcNow - date;
UnityEngine.Debug.LogFormat("Reload assemblies: {0:0.00}s", (float)timeSpan.TotalMilliseconds / 1000f);
}
EditorPrefs.DeleteKey(RELOAD_TIME_KEY);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment