Estoy navegando por el código fuente del proyecto de código abierto SignalR, y veo this diff code que tiene derecho "No use StringBuilder o foreach en este código de acceso directo camino":"No use StringBuilder o foreach en esta ruta de código de acceso"
- public static string MakeCursor(IEnumerable<Cursor> cursors)
+ public static string MakeCursor(IList<Cursor> cursors)
{
- var sb = new StringBuilder();
- bool first = true;
- foreach (var c in cursors)
+ var result = "";
+ for (int i = 0; i < cursors.Count; i++)
{
- if (!first)
+ if (i > 0)
{
- sb.Append('|');
+ result += '|';
}
- sb.Append(Escape(c.Key));
- sb.Append(',');
- sb.Append(c.Id);
- first = false;
+ result += Escape(cursors[i].Key);
+ result += ',';
+ result += cursors[i].Id;
}
- return sb.ToString();
+ return result;
}
entiendo por qué foreach podría ser menos eficiente en ocasiones, y por qué es reemplazado por de.
Sin embargo, aprendí y experimenté que StringBuilder es la forma más eficiente de concatenar cadenas. Así que me pregunto por qué el autor decidió reemplazarlo con concatenación estándar.
¿Qué hay de malo aquí y en general sobre el uso de StringBuilder?
Qué le hace pensar que 'foreach' es menos eficiente que' for'? Depende de la implementación.Y sí, usar concatenación repetida de cadenas parece una idea terrible aquí, especialmente si hay muchos cursores. –
Totalmente de acuerdo con Jon. Me sorprendería si la versión de StringBuilder tuviera un rendimiento peor que la versión de concatenación. Dependiendo del recuento de las iteraciones de bucle, podría ayudar a prevenir algunas inicializaciones de objetos implícitos "ocultos" si StringBuilder se inicializa con una capacidad de inicio mayor. ¿Has medido/perfilado ambas versiones para compararlas? –
Deberías pedírselo a [@dfowler] (http://stackoverflow.com/users/45091/dfowler) :) –