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?
Respuesta
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 ...
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
@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 ... –
@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
Recuerde que las cadenas son inmutables. System.String.Length
nunca cambia.
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. –
@ 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 –
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.
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).
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.
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.
- 1. ¿Por qué .Net Socket.Disconnect toma dos minutos?
- 2. ¿Para qué sirve la propiedad .NET Control.Margin?
- 3. ¿Cuánto tiempo toma un GC?
- 4. Qué operador lógico toma precedencia
- 5. ¿std :: string :: assign toma "propiedad" de la cadena?
- 6. .Net nombre de la propiedad
- 7. Toma de actualización MySQL (demasiado) mucho tiempo
- 8. ¿De qué sirve la propiedad Tag en .net
- 9. JAXB y orden de propiedad
- 10. lua toma http tiempo de espera
- 11. ¿Qué sintaxis toma la propiedad Current Language en una cadena de conexión de SQL Server?
- 12. .net asíncrono toma tiempo de espera de comprobación de hilo de seguridad
- 13. Java Regex lookahead toma demasiado tiempo
- 14. ¿Qué distancia toma la cobertura del código?
- 15. .NET problema orden de las columnas ListView
- 16. ¿Qué función no toma ningún argumento?
- 17. Rails created_at orden de la marca de tiempo no concuerda con la orden de identificación
- 18. Guid de orden de bytes en .NET
- 19. Propiedad HttpBrowserCapabilities.Crawler .NET
- 20. Looping a través de un cursor SQLite toma demasiado tiempo
- 21. .NET de Reflexión propiedad privada
- 22. Propiedad vs Función (específicamente .NET)
- 23. Orden de tiempo de los mensajes
- 24. ¿Por qué la propiedad A de la clase MailMessage de .net es de solo lectura?
- 25. ¿Por qué una consulta de inserción ocasionalmente toma tanto tiempo en completarse?
- 26. ¿Qué bibliotecas de series de tiempo .NET están allí?
- 27. estallido de la toma de seleccionar
- 28. stack.ToList() en .NET - orden de los elementos?
- 29. Autoupdating NSManagedObject modificación de la propiedad de marca de tiempo
- 30. Markov proceso de toma
Creo que estás preguntando sobre la propiedad .NET 'System.String.Length', ya que no existe dicha propiedad en C#. –
Relacionados: http://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and/151481 –
también relacionado: http://stackoverflow.com/questions/717801/is- string-length-in-c-net-instant-variable – jball