Find out what assemblies are being built and how long each takes.
using System; | |
using System.Collections.Generic; | |
using System.Text; | |
using UnityEditor; | |
using UnityEditor.Compilation; | |
using UnityEngine; | |
[InitializeOnLoad] | |
public class AsmdefDebug | |
{ | |
const string AssemblyReloadEventsEditorPref = "AssemblyReloadEventsTime"; | |
const string AssemblyCompilationEventsEditorPref = "AssemblyCompilationEvents"; | |
static readonly int ScriptAssembliesPathLen = "Library/ScriptAssemblies/".Length; | |
static Dictionary<string, DateTime> s_StartTimes = new Dictionary<string, DateTime>(); | |
static StringBuilder s_BuildEvents = new StringBuilder(); | |
static double s_CompilationTotalTime; | |
static AsmdefDebug() | |
{ | |
CompilationPipeline.assemblyCompilationStarted += CompilationPipelineOnAssemblyCompilationStarted; | |
CompilationPipeline.assemblyCompilationFinished += CompilationPipelineOnAssemblyCompilationFinished; | |
AssemblyReloadEvents.beforeAssemblyReload += AssemblyReloadEventsOnBeforeAssemblyReload; | |
AssemblyReloadEvents.afterAssemblyReload += AssemblyReloadEventsOnAfterAssemblyReload; | |
} | |
static void CompilationPipelineOnAssemblyCompilationStarted(string assembly) | |
{ | |
s_StartTimes[assembly] = DateTime.UtcNow; | |
} | |
static void CompilationPipelineOnAssemblyCompilationFinished(string assembly, CompilerMessage[] arg2) | |
{ | |
var time = s_StartTimes[assembly]; | |
var timeSpan = DateTime.UtcNow - s_StartTimes[assembly]; | |
s_CompilationTotalTime += timeSpan.TotalMilliseconds; | |
s_BuildEvents.AppendFormat("{0:0.00}s {1}\n", timeSpan.TotalMilliseconds / 1000f, assembly.Substring(ScriptAssembliesPathLen, assembly.Length - ScriptAssembliesPathLen)); | |
} | |
static void AssemblyReloadEventsOnBeforeAssemblyReload() | |
{ | |
s_BuildEvents.AppendFormat("compilation total: {0:0.00}s\n", s_CompilationTotalTime / 1000f); | |
EditorPrefs.SetString(AssemblyReloadEventsEditorPref, DateTime.UtcNow.ToBinary().ToString()); | |
EditorPrefs.SetString(AssemblyCompilationEventsEditorPref, s_BuildEvents.ToString()); | |
} | |
static void AssemblyReloadEventsOnAfterAssemblyReload() | |
{ | |
var binString = EditorPrefs.GetString(AssemblyReloadEventsEditorPref); | |
long bin = 0; | |
if (long.TryParse(binString, out bin)) | |
{ | |
var date = DateTime.FromBinary(bin); | |
var time = DateTime.UtcNow - date; | |
var compilationTimes = EditorPrefs.GetString(AssemblyCompilationEventsEditorPref); | |
if (!string.IsNullOrEmpty(compilationTimes)) | |
{ | |
Debug.Log("Compilation Report\n" + compilationTimes + "Assembly Reload Time: " + time.TotalSeconds + "s\n"); | |
} | |
} | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
Worth noting that the compilation time value is a cumulation of compilation performed on multiple threads, so it's not the time it took from start to finish. |
This comment has been minimized.
This comment has been minimized.
@karljj1 I don't understand why you complicated all of your code ? would you mind explaining ? This, OTOH, is simple and effective:
|
This comment has been minimized.
This comment has been minimized.
@aybe |
This comment has been minimized.
This comment has been minimized.
okay I understand now, thanks |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Some changes in my fork: https://gist.github.com/angularsen/7a48f47beb0f8a65dd786ec38b02da57
#if UNITY_EDITOR
, I wanted to have this in my ThirdParty folder and Editor special folders don't work with .asmdef filesThanks for this, very useful! I found that I spent 1-2 seconds building test files and I very rarely run my tests, rather want to run those explicitly or as part of a build agent.