2010-10-01 3 views
11

Вы бы подумали, что оба они одинаковы.Является ли C# быстрее, чем VB.NET?

Но, возможно, это компилятор, который использовал Microsoft, но я заметил, что при компиляции двух очень маленьких программ одинаковая логика. VB.NET использует больше инструкций IL.

Верно ли это, что C# должен быть быстрее, хотя бы потому, что его компилятор умнее.

+7

Дополнительные инструкции не обязательно означают более медленную программу. – ChaosPandion

+3

Вы уверены, что логика идентична? Если они достаточно малы, можете ли вы опубликовать оба примера? –

+0

Возможный дубликат кода [Is C# быстрее, чем код Visual Basic.NET?] (Http://stackoverflow.com/questions/1223660/is-c-code-faster-than-visual-basic-net-code) –

ответ

15

Это действительно сложно ответить окончательно ограниченным объемом доступной информации. Это очень помогло бы, если бы вы предоставили код из обоих образцов и использовали параметры компилятора.

Чтобы ответить на вопрос, хотя C# не является по своей сути быстрее. Оба языка генерируют IL и запускаются на CLR. Для большинства функций они даже генерируют один и тот же IL. Существуют различия в некоторых подобных функциях, но они редко дополняют значительные изменения производительности.

VB может выглядеть медленнее, если вы столкнетесь с некоторыми из тонких различий в языках и среде. Несколько общих примеры ...

  • Многих среды по умолчанию для проверяемых целочисленных операций для VB.Net, но не C#
  • Тонких вопросы кодирования может привести к позднему связыванию, где она, как представляется, в начале связывания
  • Веря switch и Select имеет ту же семантику

как только они будут удалены языки выполнять с очень похожими профилями производительности.

7

C# матч более близко к IL, чем VB.NET

VB.NET иногда делают много вещей, за кулисами. Например, при ошибке «Ошибка» Далее, чтобы написать попытку catch для каждого оператора

Но в целом оба имеют те же функции и характеристики.

Вы можете открыть код в Reflector и посмотреть как код C#. Поймите, если код C# был тем, что вы ожидали

+2

C# также делает много за кулисами, например, 'use',' lock', 'foreach'. Компилятор также может значительно изменить ваш код для повышения производительности. – ChaosPandion

+0

Да, но в целом ближе, чем VB.NET –

+5

-1. Являются ли замыкания и «доходность возврата» близкими к IL? Нет, компилятор создает [загрузки IL] (http://blogs.msdn.com/b/oldnewthing/archive/2006/08/02/686456.aspx), иногда включая все новые классы, для поддержки [одного или двух C#] (http://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/). C# отличается от IL, и тоже хорошо! Люди говорили, что ** C ** был близок к ** ассемблеру **, это то, о чем вы думаете? – MarkJ

3

Убедитесь, что программы действительно идентичны. Например, в зависимости от параметров эти две линии на самом деле очень разные:

Dim x = "some string" 

.

string x = "some string"; 

Чтобы соответствовать этому C# код, то VB должен выглядеть следующим образом:

Dim x As String = "some string" 
+1

С опцией Infer On в VB, не такие ли строки одинаковы? –

+0

@Meta Да, отсюда фраза «в зависимости от опций». Я сделаю два изменения, чтобы прояснить это, хотя: 1) В верхнем регистре Варианты 2) var -> string. –

+0

@ Meta-Night да, они идентичны с опцией Infer On. Но это только дефолт для новых проектов, начиная с 2008 года и выше. Старые проекты по-прежнему обновляются с помощью опции Infer Off, чтобы предотвратить проблемы с конверсией с поздним связыванием. – JaredPar

0

Я не делал никаких испытаний, но я думаю, что скорость будет примерно одинаковой. Если что-то выбрать для стиля и синтаксиса кодирования.

8

Ответ да и нет. Это действительно зависит от конкретной функции, о которой вы говорите. Кроме того, существуют области, где VB выполняется быстрее. Я могу привести пример каждого из них.

Этот код в VB ...

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

... о 100x быстрее, чем этого кода в C#.

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

Это не то, что VB компилятор лучше при генерации кода, который выполняет for петли быстрее, хотя. Это то, что VB вычисляет цикл, связанный один раз, когда C# вычисляет условие цикла на каждой итерации. Это просто принципиальное различие в том, как языки были предназначены для использования.

Этот код C# ...

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

... немного быстрее, чем эквивалент в VB.

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

Причина в этом случае заключается в том, что поведение по умолчанию для VB заключается в выполнении проверки переполнения, а C# - нет.

Я уверен, что существуют и другие различия на языках, которые демонстрируют сходные оценки производительности. Но оба языка построены поверх CLR и оба скомпилируются в один и тот же IL. Таким образом, создание таких правил, как «Язык X быстрее, чем язык Y», без добавления важного квалификационного предложения «в ситуации Z» просто неверно.

Смежные вопросы