2011-11-21 69 views
5

我想檢查一些類的編譯代碼有多大(以字節爲單位)。我想優化它們的大小,但我需要知道從哪裏開始。確定C#代碼大小

+2

您正在使用錯誤的語言。 – ordag

+2

Windows資源管理器? ;-) – jadarnel27

+1

這個願望是否有任何背後的實際推理,還是純粹是閒散的好奇心? – LukeH

回答

3

如果您想知道在運行時存儲類/類型所需的字節大小。

對於value types使用sizeof(type),對於reference types,請在每個字段/屬性上使用sizeof


如果你想知道被管理DLL的大小,顯然的方法是編譯DLL並檢查文件大小。要以編程方式執行此操作,請查看user1027167的答案和CodeDomProvider類。

可能在代碼中可以執行的其他功能是獲取每個方法在您的類中生成的IL以及字段的sizeof作爲(可能只是相對)大小的度量。

您可以使用MethodBase.GetMethodBody方法。

一旦Roslyn (compiler as a service)被釋放(preview available)你很可能得到它更容易和可能,準確(因爲它不只是方法和字段,使一個類的IL。


如果你想知道大小的代碼用於生成一個DLL,你必須看看像Reflector

+0

我想知道託管DLL中每個類的代碼的大小。 –

+0

當你說代碼的大小,你的意思是DLL的大小,或者用於生成DLL的代碼的大小? –

+0

已編譯代碼的大小= DLL :) –

1

假設你想知道你的編譯代碼的字節大小我認爲你必須編譯它如果你想自動化它,看看這個:

ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler()); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("system.dll"); 
cp.ReferencedAssemblies.Add("system.data.dll"); 
cp.ReferencedAssemblies.Add("system.xml.dll"); 
cp.GenerateExecutable = false; 
cp.GenerateInMemory = true; 
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString()); 
if (cr.Errors.HasErrors) 
{ 
    StringBuilder error = new StringBuilder(); 
    error.Append("Error Compiling Expression: "); 
    foreach (CompilerError err in cr.Errors) 
    { 
     error.AppendFormat("{0}\n", err.ErrorText); 
    } 
    throw new Exception("Error Compiling Expression: " + error.ToString()); 
} 
Assembly a = cr.CompiledAssembly; 

變量「代碼」(這裏是一個StringBuilder)必須包含您想要測量的類的有效源代碼。編譯完成後,您只需查看輸出程序集的大小。

+0

請注意''CSharpCodeProvider.CreateCompiler'方法現在已經過時。你可以直接在'CSharpCodeProvider'上使用'ICodeCompiler'方法。 –

+0

可能是一個解決方案。我需要做一些重構,但它可能工作。 –

3

一種方法是通過反射來獲取MSIL的大小。您需要遍歷所有方法,屬性設置器和獲取器以及構造函數以確定MSIL的大小。此外,根據Debug與Release版本的不同,大小也會有所不同。

using System.Reflection; 

int totalSize = 0; 

foreach(var mi in typeof(Example).GetMethods(BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Static | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty)) 
{ 
    MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample"); 
    MethodBody mb = mi.GetMethodBody(); 
    totalSize += mb.GetILAsByteArray().Length; 
} 
+0

我一直在尋找如何找到單個方法的MSIL大小,猜測一個方法是否可能被內聯,這對我來說是個解決方案。謝謝! –