2011-06-09 33 views
7

Título pide todo, en realidad, pero aún así, por amor de exhaustividad:¿Cuál es el máximo número de métodos por clase .NET

Hola, estoy escribiendo una pequeña herramienta de post-compilación en la plataforma .NET, y al tratar de optimizarlo, he encontrado una pregunta que no puedo encontrar fácilmente a partir de los estándares de ECMA para Common Language Infrastructure (CLI).

¿Cuál es el número máximo de métodos que puede tener una sola clase? ¿Hay un límite?

Editar:

Gracias a Kelsey para señalar a una prueba de la vida real. Aunque todavía me importa cuál es el límite real, para mis objetivos reales de la vida real, , quería saber si es 2^16/2^32 -o bien - 2^31-1, como señaló, parece estar claramente por encima de los 64K métodos por clase ...

+1

¿Qué estás haciendo donde es importante saber eso? – Sven

+5

¡Si alcanzas ese máximo, entonces lo estás haciendo mal! –

+4

No estoy de acuerdo con la evaluación de @ Colin. Dado que el OP está escribiendo una herramienta de procesamiento posterior a la compilación (?), Esta es una pregunta razonable, y dependiendo del problema exacto, una optimización donde el número de métodos se almacena internamente como 'corto' o 'byte' en lugar de como un 'int' (decir) puede tener sentido (por supuesto, esta será la excepción absoluta, pero demos al OP el beneficio de la duda). –

Respuesta

5

Pregunta interesante pero no hay ninguna pista de por qué alguna vez llegarías al límite en realidad así que la respuesta podría no ser tan útil porque es un número alto.

yo encontramos este thread donde alguien escribió la siguiente prueba para crear realmente una clase con cantidades crecientes de funciones para ver donde el punto de quiebre fue:

namespace MethodCountLimitFinder 
{ 
    class Program 
    { 
     [System.STAThreadAttribute] 
     static void Main (string [] args) 
     { 
      Microsoft.CSharp.CSharpCodeProvider provider = 
       new Microsoft.CSharp.CSharpCodeProvider() ; 
      System.CodeDom.Compiler.CompilerParameters cp = 
       new System.CodeDom.Compiler.CompilerParameters() ; 
      cp.GenerateExecutable = false ; 
      cp.GenerateInMemory = true ; 
      System.CodeDom.Compiler.CompilerResults cr = null ; 
      System.Text.StringBuilder inner = 
       new System.Text.StringBuilder ("namespace Tester { class Test {") ; 

      int methodCount = 1000000 ; 
      while (true) 
      { 
       System.Console.WriteLine (methodCount) ; 

       for (int i = methodCount ; i > 0 ; i--) 
       { 
        inner.AppendFormat ("void M{0}(){{}}\n" , methodCount++) ; 
       }  
       inner.Append ("}}") ;     
       cr = provider.CompileAssemblyFromSource (cp , inner.ToString()) ; 
       if (cr.Errors.Count > 0) 
       { 
        break; 
       }     
       inner.Remove (inner.Length - 2 , 2) ; 
      } 
      foreach ( System.CodeDom.Compiler.CompilerError ce in cr.Errors) 
      { 
       System.Console.WriteLine (ce.ToString()) ; 
      } 
     } 
    } 
} 

Con base en los resultados que parece que depende de los recursos , no la especificación que con toda probabilidad no está definida a menos que la vincule a una referencia de índice de 32/64 bits o algo que no creo que sea realista ya que, de todos modos, alcanzará el límite de recursos probablemente primero.

La prueba obtuvo más de 200k + antes de fallar debido a la falta de recursos.

De nuevo, interesante pero no es tan útil la información de la OMI.

+0

Esto bien podría estar llegando a límites con el número de ensamblados (dinámicos) en un Dominio de aplicación (o módulos en un proceso de Win32) antes de acercarse al límite de los métodos por clase o ensamblado. – Richard

+0

La razón por la que me importa, es porque estoy tratando de crear una estructura de búsqueda rápida donde básicamente necesito almacenar un índice tan compacto como sea posible para una matriz de métodos y un recuento. Si pudiera suponer que ambos son 16 bits (si el límite del método hubiera sido de 16 bits), podría empacarlos a ambos en un valor de 32 bits (es decir, startIdx | count << 16) – damageboy

2

creo que tendrá que mirar a través de las interfaces no administrados en el CLR para las definiciones de los metadatos estructuras para encontrar límites en el tamaño de esas estructuras. Este answer (y comentarios) ya indica que esto es ~ 16 millones (índice de 24 bits) por ensamblaje (no por tipo).

Considere alternativamente que los métodos de reflexión devuelven matrices, y hay un límite de 1 GB por objeto en el tiempo de ejecución .NET actual, por lo que el máximo sería 1024^3/sizeof(MethodIndo).

Cuestiones relacionadas