2008-11-14 10 views
9

Similar a this pregunta, pero para VB.NET ya que aprendí que esto es algo de lenguaje.¿VB.NET optimiza la concatenación de literales de cadena?

Por ejemplo, sería el compilador saber para traducir

Dim s As String = "prueba" "este" + "función" +

a

Dim s As String = "test this function" 

y así evitar el golpe de rendimiento con la concatenación de cadenas?

Respuesta

11

Sí. Lo hace. Solo probé VS 2008 pero sospecho fuertemente que las versiones anteriores también lo hicieron.

VB.NET

Public Class Class1 


    Dim s As String = "test " + "this " + "function" 

    Public Function test() As String 
     Return s 
    End Function 

End Class 

I. L. - Observe la "prueba de esta función" cadena

{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: call instance void [mscorlib]System.Object::.ctor() 
    L_0006: nop 
    L_0007: ldarg.0 
    L_0008: ldstr "test this function" 
    L_000d: stfld string ClassLibrary1.Class1::s 
    L_0012: nop 
    L_0013: ret 
} 
4

Mientras lo busco, here's the download page for the spec.

La sección 11.2 parece que sería el bit correcto, es básicamente el equivalente a 7.18 en la especificación C# 3.0, pero no contiene la misma garantía. Sospecho que el compilador aún lo hace, pero no puedo ver ninguna garantía. Tendré otra mirada sin embargo.

Sección 11.2 sí afirma que "Una expresión constante es una expresión cuyo valor puede ser evaluado completamente en tiempo de compilación" (el subrayado es mío), pero no puedo ver que lo que realmente garantiza que se evaluar plenamente en tiempo de compilación Francamente, sería extraño crear una categoría de expresión basada en esta condición, pero no usarla realmente.

Una prueba rápida muestra que el compilador de VB actual efectivamente hace la concatenación en tiempo de compilación, pero realmente debería ser una garantía en la especificación si esa es la intención.

Sección 7.3 conseguir un poco más cerca:

Cuando los operandos de una expresión son todas las constantes de tipo primitivo, es posible que el compilador para evaluar la expresión en tiempo de compilación. Tal expresión se conoce como expresión constante .

Ahora cadena no es un tipo primitivo en términos del CLR (Type.IsPrimitive volvería falsa) pero es en cuanto a la especificación de VB.

Todavía no está diciendo que va a evaluarlo, aunque ...

+0

Ahora es una carrera para encontrarlo en la especificación. :-) – Larsenal

1

El compilador optimizar una concatenación de cadenas cuando sea apropiado. Sin embargo, debería considerar usar la clase StringBuilder si no sabe cuántas concatenaciones puede haber.

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

Desde el artículo anterior:

La realización de una operación de concatenación de una cadena o objeto StringBuilder depende de con qué frecuencia ocurre una asignación de memoria. Una operación de concatenación cadena siempre asigna memoria, mientras que una operación de concatenación StringBuilder solamente asigna memoria si la memoria intermedia de objetos StringBuilder es demasiado pequeña para acomodar los nuevos datos. En consecuencia, la clase String es preferible para una operación de concatenación si hay un número fijo de objetos String concatenados. En ese caso , las operaciones de concatenación individual incluso pueden combinarse en una sola operación por el compilador. Un objeto StringBuilder de es preferible para una operación de concatenación si un número arbitrario de es concatenado; por ejemplo, si un bucle concatena un número aleatorio de cadenas de entrada de usuario.

5

SÍ, LO HACE! PÓNGALO PARA PROBAR.

Desde .NET compila todos los idiomas que gestiona (VB, C#, C++) a las instrucciones IL (Intermedio idioma) y String tipo es parte de CLS (Common Language Specification) todas las versiones de .NET Framework: 2.0, 3.0, 3.5, 4.0 optimiza la concatenación de literales String como parte del proceso de compilación.

Para el código de VB.NET ejemplo a continuación:

Dim s As String = "A" & "B" & "C" 

produce la siguiente instrucción IL:

L_0008: ldstr "ABC" 

Esto demuestra claramente que el compilador está optimizando String concatenación literal (probado en: ildasm.exe)

Sin embargo, si el código obove está escrito en instrucciones separadas:

Dim s As String = "A" 
s &= "B" 
s &= "C" 

no se realiza optimización y la concatenación String se ejecuta en tiempo de ejecución (sobrecarga de rendimiento). Lo mismo aplica para una sola instrucción de línea con datos resueltos en tiempo de ejecución (variables, propiedades, métodos).

Uso subrayado _ para conectar declaraciones anteriores en un solo estado para hacer cumplir la optimización:

Dim s As String = "A" _ 
& "B" _ 
& "C" _ 

y en caso de que necesita nuevas líneas entre tokens usar vbCrLf (en tiempo de compilación) constante para asegurar la optimización porque el uso de Environment.NewLine (La propiedad no proporciona optimización.

¡Espero que esto te ayude a obtener el mejor rendimiento!

Cuestiones relacionadas