Me gustaría comprobar qué tan grande es el código compilado de algunas clases (en bytes). Me gustaría optimizarlos para el tamaño, pero necesito saber por dónde empezar.Determinar el tamaño del código C#
Respuesta
Si desea saber el tamaño en bytes necesarios para almacenar una clase/tipo en tiempo de ejecución.
Para value types use , para reference types, use sizeof
en cada campo/propiedad.
Si desea saber el tamaño de los archivos DLL administrados, la manera obvia es compilar el archivo DLL y comprobar el tamaño del archivo. Para hacer esto programáticamente, eche un vistazo a la respuesta del usuario1027167 y la clase CodeDomProvider
.
Algo más que se puede hacer en el código es obtener el IL generado de cada método en sus clases, así como el sizeof
de los campos como una medida de tamaño (tal vez solo relativo).
Puede usar el método MethodBase.GetMethodBody para esto.
Una vez que el Roslyn (compiler as a service) se libera (preview available) que probablemente se podría obtener con mayor facilidad y, posiblemente, con precisión (ya que no son sólo los métodos y campos que componen una clase IL.
Si desea conocer la el tamaño del código utilizado para producir una DLL, tendrá que buscar en algo así como Reflector
Me gustaría saber el tamaño del código de cada clase en DLL administrado. –
Cuando dice tamaño de código, ¿quiere decir el tamaño de la DLL o el tamaño del código utilizado para producir la DLL? –
Tamaño del código compilado = DLL :) –
Suponiendo que usted quiere saber el tamaño en bytes de su código compilado yo creo que hay que compilarlo. Si desea automatizar esto, mira esto:
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;
La variable "código" (aquí es un StringBuilder) debe contener el código fuente válido de la clase que desea medir. Después de la compilación, solo tiene que ver qué tamaño tiene el ensamblaje de salida.
Tenga en cuenta que el método 'CSharpCodeProvider.CreateCompiler' ahora está obsoleto. Puede usar los métodos 'ICodeCompiler' en' CSharpCodeProvider' directamente. –
Podría ser una solución. Tendría que hacer algunas refactorizaciones, pero podría funcionar. –
Un método será obtener el tamaño de MSIL con Reflection. Necesitará recorrer todos los métodos, Property setters and getters, y constructors para determinar el tamaño de MSIL. Además, habrá diferencias en el tamaño en función de las versiones de Debug versus 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;
}
Estaba buscando cómo encontrar el tamaño MSIL de un único método, para adivinar si un método probablemente estaría incluido, y esta fue la solución para mí. ¡Gracias! –
- 1. C# Tamaño del código y tiempo de ejecución del código
- 2. ¿Se puede determinar el tamaño del archivo que se descargará?
- 3. No se puede determinar el tamaño del terminal con ncurses
- 4. ¿Hay alguna manera de determinar el tamaño físico del monitor?
- 5. Determinar el tamaño total del directorio/troncal SVN
- 6. ¿Manera elegante de determinar el tamaño total del sitio web?
- 7. Determinar el tamaño de la memoria asignada dinámicamente en C
- 8. ¿Cómo determinar el tamaño de un búfer C asignado?
- 9. Dónde determinar el tamaño de UIView
- 10. jUnidad: ¿Cómo determinar el nivel de cobertura del código?
- 11. Obtener el tamaño del puntero en C
- 12. Cómo determinar el tamaño del mensaje WCF en el nivel del codificador
- 13. ¿Reduciendo el tamaño del código EXE objetivo GCC?
- 14. Determinar las consecuencias de rendimiento del código PHP
- 15. Determinar el tamaño de la matriz en el inicializador del constructor
- 16. Determinar el tamaño del clúster del sistema de archivos en Python
- 17. lo que significa 'el tamaño del código' en MSIL significa
- 18. Cambiar el tamaño de fuente del código en WebStorm IDE
- 19. Tamaño del carácter ('a') en C/C++
- 20. ¿Cómo determinar el tamaño de un icono de un HICON?
- 21. Determinar el nombre del equipo del cliente
- 22. C# por qué cambiar el tamaño de la imagen aumentará el tamaño del archivo
- 23. Mejorando el rendimiento del código C
- 24. Cálculo del tiempo por el código C++
- 25. Determinar el tamaño de etiqueta en función de la cantidad de texto y el tamaño de fuente en Winforms/C#
- 26. Cómo determinar el tamaño de la cadena y comprimirla
- 27. Por qué el tamaño del archivo de objeto cambia para el mismo código en C y C++
- 28. Determinación del tamaño de una clase polimórfica C++
- 29. Obtener el tamaño del clúster de un disco duro (a través del código)
- 30. ¿Existe alguna manera simple de determinar el tamaño de letra en C#?
Está utilizando un lenguaje incorrecto. – ordag
Windows Explorer? ;-) – jadarnel27
¿Tiene este deseo algún razonamiento práctico detrás de él, o es puramente inactividad? – LukeH