variable usar una recortar programacion longitud invertida funciones espacios ejemplos como cadena blanco asigna agregar .net vb.net performance optimization

usar - ¿VB.NET optimiza la concatenación de cadenas literales?



recortar string c# (5)

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

Del artículo anterior:

La ejecución de una operación de concatenación para un objeto String o StringBuilder depende de la frecuencia con la que se produce una asignación de memoria. Una operación de concatenación de cadenas siempre asigna memoria, mientras que una operación de concatenación StringBuilder solo asigna memoria si el búfer de objetos StringBuilder es demasiado pequeño para acomodar los datos nuevos. En consecuencia, la clase String es preferible para una operación de concatenación si se concatena un número fijo de objetos String. En ese caso, las operaciones de concatenación individuales incluso podrían combinarse en una única operación por el compilador. Un objeto StringBuilder es preferible para una operación de concatenación si se concatenan un número arbitrario de cadenas; por ejemplo, si un bucle concatena un número aleatorio de cadenas de entrada del usuario.

Similar a esta pregunta, pero para VB.NET ya que aprendí que esto es algo del lenguaje.

Por ejemplo, ¿el compilador sabría traducir

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

a

Dim s As String = "test this function"

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



Mientras lo busco, aquí está la página de descarga de la especificación .

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.

La Sección 11.2 dice que "Una expresión constante es una expresión cuyo valor puede evaluarse completamente en tiempo de compilación " (énfasis mío), pero no veo que realmente garantice que la evaluará completamente 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 haber una garantía en la especificación si esa es la intención.

La sección 7.3 se acerca un poco:

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

Ahora String no es un tipo primitivo en términos de CLR ( Type.IsPrimitive devolvería false) sino que está en términos de la especificación VB.

Todavía no dice que lo va a evaluar ...


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

IL - Observe que la cadena "prueba esta función"

{ .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 }


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

Dado que .NET compila todas las lenguas administradas (VB, C #, C ++) a IL (lenguaje intermedio) y String tipo de String es parte de CLS (Common Language Specification) todas las versiones de .NET Framework: 2.0, 3.0, 3.5, 4.0 optimiza String concatenación de String literales como parte del proceso de compilación.

Por ejemplo, el código VB.NET 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 String (probado en: ildasm.exe)

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

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

no se realiza ninguna optimización y String concatenación de 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).

Use guion bajo _ para conectar las instrucciones anteriores en una sola instrucción para aplicar la optimización:

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

y en caso de que necesite nuevas líneas entre tokens, use la constante vbCrLf (tiempo de compilación) para garantizar la optimización, ya que el uso de la propiedad Environment.NewLine (tiempo de ejecución) no ofrece optimización.

Espero que esto te ayude a obtener el mejor rendimiento.