La mejor forma de comprobar es probando ambos métodos en un bucle, aproximadamente 100.000 cada uno. Mida la cantidad de tiempo que cada 100.000 iteraciones toma y compárelas. No creo que haya mucha diferencia. Pero hay una pequeña diferencia, sin embargo. El primer ejemplo tendrá tantas variables como el número de iteraciones. El segundo ejemplo solo tiene una variable. El compilador es lo suficientemente inteligente como para realizar algunas optimizaciones aquí, por lo que no notará una mejora en la velocidad. Sin embargo, si no desea utilizar el último objeto generado dentro del bucle una vez que está fuera del bucle nuevamente, entonces la primera solución sería mejor. En la segunda solución, solo toma un tiempo antes de que el recolector de basura libere el último objeto creado. En el primer ejemplo, el recolector de basura será un poco más rápido para liberar el objeto. Depende del resto del código, pero si almacena una gran cantidad de datos en este objeto StringBuilder, entonces el segundo ejemplo podría mantenerse en esta memoria mucho más tiempo, disminuyendo así el rendimiento de su código después de abandonar el ciclo!
Por otra parte, si los objetos consumen 100 KB y tiene 16 GB en su máquina, a nadie le importa ... El recolector de basura finalmente lo liberará nuevamente, probablemente tan pronto como salga del método que contiene este ciclo.
Similar a http://stackoverflow.com/questions/2447475/best-practice-for-creating-objects-used-in-for-foreach-loops –
Un error no relacionado es que la segunda versión se debe inicializar a nulo para evitar una asignación excesiva. –