En .NET, Substring
es O (n) en lugar de la junta (1) de Java. Esto se debe a que en .NET, el objeto String contiene todos los datos de caracteres reales en sí - por lo que tomar una subcadena implica copiar todos los datos dentro de la nueva subcadena. En Java, substring
puede simplemente crear un nuevo objeto refiriéndose a la matriz de caracteres original, con un índice y longitud de inicio diferente.
Hay pros y los contras de cada enfoque:
- enfoque de .NET tiene una mejor coherencia de caché, crea menos objetos , y evita la situación en la que una pequeña subserie evita una gran
char[]
ser basura recogida . Creo que en algunos casos también puede hacer que la interoperabilidad sea muy fácil, internamente.
- enfoque de Java hace tomando una subcadena muy eficiente, y probablemente algunas otras operaciones también
Hay un poco más de detalle en mi strings article.
En cuanto a la cuestión general de evitar los errores de rendimiento, creo que debería tener una respuesta enlatada lista para cortar y pegar: asegúrese de que su arquitectura es eficiente, y ponerlo en práctica de la manera más legible que pueda. Mida el rendimiento y optimice dónde encuentra los cuellos de botella.
Por cierto, esto hace string
muy especial - es el único tipo no-matriz cuyos huella de memoria varía por ejemplo dentro de la misma CLR.
Para cuerdas pequeñas, esta es una gran victoria. Ya es suficientemente malo que exista toda la sobrecarga de un objeto, pero cuando también hay una matriz extra involucrada, una cadena de un solo carácter podría tomar alrededor de 36 bytes en Java. (Ese es un número de "dedo en el aire": no puedo recordar las transparencias exactas de los objetos. También dependerá de la VM que esté utilizando).
¿Por qué no ejecuta sus propios microcalibrados para probar esto? ? ¿Puede vincular a fuentes que dicen que tiene un rendimiento "malo"? – Oded
@Oded: fuente es el comentario de Danny Chen aquí http://stackoverflow.com/questions/3474254/how-to-make-a-first-letter-capital-in-c/3474263#3474263; Honestamente, me sorprendería si 'Subcadena' no es' O (1) 'operación de tiempo y espacio (como, por ejemplo, Java), pero le estoy dando el beneficio de la duda ya que no conozco .NET. – polygenelubricants
¿Qué significa "mala actuación"? En relación a qué? .NET también tiene un mal rendimiento si se compara con C++, por ejemplo. ¿Deberíamos soltar .NET por eso? –