2010-10-01 20 views
11

Cualquiera pensaría que ambos son iguales.¿C es más rápido que VB.NET?

Pero tal vez es el compilador que Microsoft ha utilizado, pero me he dado cuenta de que al compilar dos programas muy pequeños, lógica idéntica. VB.NET usa más instrucciones de IL.

Es cierto que C# debe ser más rápido, aunque solo sea porque su compilador es más inteligente.

+7

Más instrucciones no significan necesariamente un programa más lento. – ChaosPandion

+3

¿Está * seguro * la lógica es idéntica? Si son lo suficientemente pequeños, ¿puedes publicar ambos ejemplos? –

+0

posible duplicado de [¿El código C# es más rápido que el código Visual Basic.NET?] (Http://stackoverflow.com/questions/1223660/is-c-code-faster-than-visual-basic-net-code) –

Respuesta

15

Esto es realmente difícil de responder definitivamente con la cantidad limitada de información disponible. Ayudaría mucho si proporcionara el código de ambas muestras y las opciones de compilación utilizadas.

Para responder a la pregunta, sin embargo, C# no es inherentemente más rápido. Ambos idiomas generan IL y se ejecutan en CLR. Para la mayoría de las características, incluso generan la misma IL. Existen diferencias para algunas características similares, pero rara vez se suman a cambios de rendimiento significativos.

VB puede aparecer más lento si se encuentra con algunas de las sutiles diferencias en los idiomas y el entorno. Un par de ejemplos comunes son ...

  • Muchos entornos por defecto para operaciones con enteros controladas para VB.Net pero no C#
  • problemas de codificación sutiles pueden conducir a la ligadura dinámica en la que parece estar enlace anticipado
  • creyendo switch y Select han la misma semántica

Una vez que éstos se eliminan las lenguas realizan con perfiles de rendimiento muy similares.

7

C# partido más cerca de IL VB.NET

VB.NET veces hacer muchas cosas detrás de las escenas. Como en reanudar error al lado, que escribe una captura de prueba para cada instrucción

Pero, en general, ambas tienen las mismas características y el mismo rendimiento.

Puede abrir su código en Reflector y ver como código C#. Realice si el código C# fue el que esperaba

+2

C# también hace muchas cosas entre bastidores, por ejemplo, 'using',' lock', 'foreach'. El compilador también puede alterar drásticamente su código para mejorar el rendimiento. – ChaosPandion

+0

Sí, pero en general está más cerca que VB.NET –

+5

-1. ¿Los cierres y el rendimiento de retorno están cerca de IL? No, el compilador crea [cargas de IL] (http://blogs.msdn.com/b/oldnewthing/archive/2006/08/02/686456.aspx), que a veces incluye clases completamente nuevas, para admitir [una o dos Declaraciones C#] (http://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/). C# es muy diferente de IL, ¡y algo bueno también! La gente solía decir ** C ** estaba cerca del ** lenguaje ensamblador **, ¿es eso en lo que estás pensando? – MarkJ

3

Asegúrese de que los programas sean realmente idénticos. Por ejemplo, dependiendo de Opciones, estas dos líneas son realmente muy diferentes:

Dim x = "some string" 

.

string x = "some string"; 

para que coincida con el código C#, VB debe tener este aspecto:

Dim x As String = "some string" 
+1

Con Option Infer activado en VB, ¿no son esas líneas también idénticas? –

+0

@Meta Sí, de ahí la frase "dependiendo de las opciones". Sin embargo, haré dos ediciones para aclararlo: 1) Opciones en mayúsculas 2) var -> cadena. –

+0

@ Meta-Night sí, son idénticas a Option Infer On. Pero eso es solo el valor predeterminado para los proyectos nuevos que comiencen en 2008 y posteriores. Los proyectos antiguos aún se actualizan con Option Infer Off para evitar problemas de conversión con el enlace tardío. – JaredPar

0

No he hecho ninguna prueba, pero creo que la velocidad sería la misma. Si hay algo, seleccione el estilo de codificación y la sintaxis.

8

La respuesta es sí y no. Realmente depende de a qué característica específica te estás refiriendo. Del mismo modo, hay áreas donde VB se ejecuta más rápido. Puedo dar un ejemplo de cada uno.

Este código en VB ...

For i As Integer = 0 To Convert.ToInt32(Math.Pow(10, 8)) 
Next 

... se trata de 100x más rápido que el código en C#.

for (int i = 0; i <= Convert.ToInt32(Math.Pow(10, 8)); i++) 
{ 
} 

No es que el compilador de VB es mejor en la generación de código que se ejecuta for bucles más rápido sin embargo. Es que VB calcula el lazo enlazado una vez mientras que C# calcula la condición del ciclo en cada iteración. Es solo una diferencia fundamental en la forma en que se pretendía utilizar los idiomas.

Este código es C# ...

int value = 0; 
for (int i = 0; i <= NUM_ITERATIONS; i++) 
{ 
    value += 1; 
} 

... es ligeramente más rápido que el equivalente en VB.

Dim value As Integer = 0 
For i As Integer = 0 To NUM_ITERATIONS 
    value += 1 
Next 

La razón por la que en este caso es que el comportamiento por defecto para VB es llevar a cabo la comprobación de desbordamiento mientras que C# no lo hace.

Estoy seguro de que hay otras diferencias en los idiomas que muestran sesgos de rendimiento similares. Sin embargo, ambos lenguajes se crean sobre el CLR y ambos compilan a la misma IL. Entonces, hacer afirmaciones generales como "Idioma X es más rápido que el lenguaje Y" sin agregar la importante cláusula "en situación Z" que califica son simplemente incorrectas.

Cuestiones relacionadas