2010-05-14 8 views
11

Pedí a alguien que evitara llamar repetidas veces al String.Length, porque se volvió a calcular cada vez que lo llamé. Supuse que String.Length se ejecutó en O (1) vez. ¿Es String.Length más complejo que eso?¿Qué orden de tiempo toma la propiedad .NET System.String.Length?

+4

Creo que estás preguntando sobre la propiedad .NET 'System.String.Length', ya que no existe dicha propiedad en C#. –

+0

Relacionados: http://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and/151481 –

+1

también relacionado: http://stackoverflow.com/questions/717801/is- string-length-in-c-net-instant-variable – jball

Respuesta

20

Eso es un mal consejo - String.Length es de hecho O (1). No es como strlen en C.

Es cierto que no es garantizada en the docs por lo que yo puedo decir, pero la inmutabilidad de las cuerdas hace que sea una cosa muy tonta no hacer O (1). (Y no sólo O (1), pero una rápida tiempo muy constante también.)

Francamente si alguien está dando ese tipo de consejos, que se convertiría en un poco más escépticos sobre otra consejos que pueden proporcionar también ...

+0

Realmente me gustaría ver primero el contexto, decir que la llamada está innecesariamente en un ciclo con millones de iteraciones ... en general, en esos casos es una buena práctica no llamar a una propiedad si es la misma para el todo lazo. – eglasius

+6

@Freddy: No estoy de acuerdo: si es el código más simple y está evaluando una propiedad muy simple que va a estar en línea, prefiero hacerlo que introducir una variable local temporal. En algunos casos (longitudes de matriz) el JIT * hace * mejor * el uso de la propiedad que con un local temporal ... –

+0

@Freddy Rios, no sé, pero no me sorprendería que el compilador sepa que las cadenas son inmutables y optimiza la codificar en consecuencia. Sería, creo, una optimización bastante fácil para un compilador. – tster

2

Recuerde que las cadenas son inmutables. System.String.Length nunca cambia.

+9

Esto no responde a la pregunta si el método toma O (1) vez - el método todavía podría ser O (n) por ejemplo. –

+0

@ Daniel: este hecho, además de sentido común, más el hecho de que hay "n" la gente revisando el código, para n> 1000, y asumiendo que el 1% de ellos tienen el sentido de Dios dio una estudiante de primer año, más o menos _does_ probar que la propiedad se ejecuta en tiempo constante. No se requieren matemáticas –

4

String.Length es O (1). La razón por la que la gente le dice que no lo llame en un bucle es porque es un acceso a la propiedad, que es lo mismo que una llamada a un método. En realidad, una llamada al método extra rara vez hace una diferencia significativa.

Como siempre, no comience a revisar el código guardando en caché todas las llamadas a String.Length a menos que su generador de perfiles diga que es el origen de un problema de rendimiento.

0

De acuerdo con los comentarios internos, la propiedad String.Length es una instrucción única que no ejecuta un bucle for. Por lo tanto, es una operación O (1).

1

No, no recalcula. El tipo de cadena es inmutable.

ir más lejos, de acuerdo con las directrices de diseño .net marco, una propiedad de un objeto que es en gran medida estática y no volátil en la naturaleza sería diseñado como propiedad. Si la propiedad es de naturaleza volátil y necesita un nuevo cálculo en cada convocatoria, estará disponible como método.

puede tomar esta regla mientras intenta comprobar si una propiedad necesita ciclos de procesamiento suficientes para atraer su atención.

2

Como han dicho otros, String.Length es una propiedad constante. Si realmente le importa el rendimiento (o tiene iteraciones significativas), puede asignar su valor a una variable entera local una vez, y leer eso muchas veces (en un bucle, etc.). Esto daría al optimizador una mejor oportunidad de asignar este valor a un registro de CPU. El acceso a una propiedad es una operación mucho más costosa que una variable de pila o un registro.

Cuestiones relacionadas