Chciałbym sprawdzić, jak duży jest skompilowany kod niektórych klas (w bajtach). Chciałbym je zoptymalizować pod względem rozmiaru, ale muszę wiedzieć, od czego zacząć.Określ rozmiar kodu C#
Odpowiedz
Jeśli chcesz poznać rozmiar w bajtach potrzebny do zapisania klasy/typu w środowisku wykonawczym.
Dla value types użyj sizeof(type)
, dla reference types, użyj sizeof
dla każdego pola/właściwości.
Jeśli chcesz poznać rozmiar zarządzanych bibliotek DLL, oczywistym sposobem jest skompilowanie biblioteki dll i sprawdzenie rozmiaru pliku. Aby to zrobić programowo, spójrz na odpowiedź user1027167 i klasę CodeDomProvider
.
Coś jeszcze, co może być zrobione w kodzie, to wygenerowanie wygenerowanej IL każdej metody w twoich klasach oraz sizeof
pól jako miary (może tylko względnej) wielkości.
Do tego celu można użyć metody MethodBase.GetMethodBody.
Po Roslyn (compiler as a service) zwolnieniu (preview available) prawdopodobnie można dostać łatwiej i ewentualnie dokładnie (jak to nie tylko metod i pól, które tworzą klasę Il.
Jeśli chcesz wiedzieć rozmiar kodu używanego do utworzenia biblioteki DLL, będziesz musiał sprawdzić coś w stylu: Reflector
Chciałbym znać rozmiar kodu każdej klasy w zarządzanej DLL. –
Kiedy mówisz o rozmiarze kodu, masz na myśli rozmiar biblioteki DLL lub rozmiar kodu użytego do utworzenia biblioteki DLL? –
Rozmiar skompilowanego kodu = DLL :) –
Zakładając, że chcesz poznać rozmiar w bajtach skompilowanego kodu, myślę, że musisz go skompilować. Jeśli chcesz zautomatyzować to, spójrz na to:
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;
Zmienna "kod" (tutaj: StringBuilder) musi zawierać poprawny kod źródłowy klasy, którą chcesz zmierzyć. Po kompilacji wystarczy spojrzeć na rozmiar zespołu wyjściowego.
Należy zauważyć, że metoda 'CSharpCodeProvider.CreateCompiler' jest już nieaktualna. Możesz użyć metod 'ICodeCompiler' na' CSharpCodeProvider' bezpośrednio. –
Może być rozwiązaniem. Będę musiał dokonać refaktoryzacji, ale to może zadziałać. –
Jedną z metod będzie uzyskanie rozmiaru MSIL z odbiciem. Będziesz musiał przechodzić przez wszystkie metody, selektory i pobierające właściwości oraz konstruktory, aby określić rozmiar MSIL. Ponadto będą różnice w wielkości w zależności od wersji Debug i wersji 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;
}
Szukałem, jak znaleźć rozmiar MSIL jednej metody, aby odgadnąć, czy metoda będzie prawdopodobnie inline, i to było dla mnie rozwiązanie. Dzięki! –
- 1. C# Rozmiar kodu i czas wykonania kodu
- 2. IntelliJ: Określ rozmiar zakładki na jeden projekt
- 3. Rozmiar IL dla kodu Xamarin C#?
- 4. Określ rozmiar lob w jednostce jpa
- 5. Określ kompilator C++ w Waf
- 6. Jak zmniejszyć rozmiar wyjściowy ciężkiego szablonu kodu C++?
- 7. Oracle - Określ maksymalny obsługiwany rozmiar dla wyrażenia regularnego
- 8. Jak zwiększyć rozmiar próbek kodu?
- 9. C# dlaczego rozmiar obrazu zwiększy rozmiar pliku
- 10. Szukasz kodu porównawczego kodu (C++)
- 11. Określ szerokość i wysokość działki
- 12. Maksymalny rozmiar stosu w programie C/C +?
- 13. Rozmiar parametru delegatu C#
- 14. C++ Podbudowa Bitfield Rozmiar
- 15. Określ plik wyjściowy cythonu
- 16. Maksymalny rozmiar kodu dla Google App Engine
- 17. Rozmiar kodu źródłowego, praktyczny, teoretyczny i absurdalny
- 18. Maksymalny rozmiar stosu C/C++ programu
- 19. Wtyczka kodu kodu Visual Studio dla C++
- 20. Wyjście tego kodu C
- 21. Generator kodu C#
- 22. Wizualizacja kodu C++
- 23. Optymalizacja fragmentu kodu C#
- 24. Generowanie kodu HDF5 C
- 25. Zatrzymaj wykonywanie kodu C#
- 26. Przepisanie kodu C# F #
- 27. C# organizowanie mojego kodu
- 28. C# fragment kodu autopoziomu?
- 29. Wektor C++ zmniejsz rozmiar alokacji
- 30. Określ ogólną jasność obrazu
Używasz niewłaściwego języka. – ordag
Eksplorator Windows? ;-) – jadarnel27
Czy to pragnienie ma jakieś praktyczne uzasadnienie, czy jest to czysto bezczynna ciekawość? – LukeH