我想檢查一些類的編譯代碼有多大(以字節爲單位)。我想優化它們的大小,但我需要知道從哪裏開始。確定C#代碼大小
確定C#代碼大小
回答
如果您想知道在運行時存儲類/類型所需的字節大小。
對於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
我想知道託管DLL中每個類的代碼的大小。 –
當你說代碼的大小,你的意思是DLL的大小,或者用於生成DLL的代碼的大小? –
已編譯代碼的大小= DLL :) –
假設你想知道你的編譯代碼的字節大小我認爲你必須編譯它如果你想自動化它,看看這個:
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)必須包含您想要測量的類的有效源代碼。編譯完成後,您只需查看輸出程序集的大小。
請注意''CSharpCodeProvider.CreateCompiler'方法現在已經過時。你可以直接在'CSharpCodeProvider'上使用'ICodeCompiler'方法。 –
可能是一個解決方案。我需要做一些重構,但它可能工作。 –
一種方法是通過反射來獲取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;
}
我一直在尋找如何找到單個方法的MSIL大小,猜測一個方法是否可能被內聯,這對我來說是個解決方案。謝謝! –
- 1. 確定代碼大小
- 2. 優化PHP代碼(試圖確定最小/最大/大小寫)
- 3. Xamarin c#代碼的IL大小?
- 4. 如何確定項目的大小(代碼行,功能點等)
- 5. 如何確定SWF中的代碼和資產大小?
- 6. 如何確定C#對象的大小
- 7. 確定c中位塊的大小
- 8. 比較代碼大小與源代碼大小
- 9. 確定Java代碼的大O
- 10. .NET CIL代碼大小
- 11. 確定頁面表大小
- 12. 確定BLOB列的大小
- 13. 確定回購大小?
- 14. 確定文件夾大小
- 15. 確定數組的大小
- 16. 確定LocalSocket讀取大小
- 17. 何處確定UIView大小
- 18. 確定UITableViewCell的大小
- 19. C/C++代碼轉換大端到小端
- 20. 如何創建代碼段的大小應該在16 mb(以字節代碼)大小C++程序
- 21. c代碼有小限制
- 22. 根據Winforms/C中的文本和字體大小確定標籤大小#
- 23. QR碼自定義大小
- 24. 用EF代碼優先確定SQL Azure數據庫版本和大小?
- 25. windows進程的精確代碼段大小
- 26. Python代碼中的最大值和最小值不正確
- 27. 編組爲本地代碼時緩衝區大小不正確
- 28. 定義不確定大小的數組
- 29. C++固定大小鏈表
- 30. c - 從中一定大小
您正在使用錯誤的語言。 – ordag
Windows資源管理器? ;-) – jadarnel27
這個願望是否有任何背後的實際推理,還是純粹是閒散的好奇心? – LukeH