Почему языки .net различаются по производительности? - PullRequest
19 голосов
/ 28 июня 2011

Я слышал, что C ++ .NET - самый быстрый, C # - следующий, за ним следуют VB .NET и такие языки, как Iron-Python и Boo, - последние по производительности Если все языки .NET компилируются в промежуточный байт-код, который одинаков, то почему разница в производительности?

Это понятно для Boo и Python, так как все типы должны оцениваться во время выполнения. Но почему разница между такими языками, как C ++ и C #?

Ответы [ 5 ]

19 голосов
/ 28 июня 2011

Python работает хуже, потому что он интерпретируется, а не компилируется.Вместо преобразования в CIL (общий промежуточный язык) перед запуском, он преобразуется во время выполнения, что, очевидно, повлечет за собой снижение производительности.

Кроме того, поскольку IronPython имеет динамическую типизацию, можно выполнить меньше оптимизаций, когдапо сравнению со статически типизированными языками (которыми являются C ++, C # и, несмотря на синтаксис Pythonesque, Boo).

Вы также должны учитывать количество усилий, приложенных для оптимизации каждой реализации.C # и C ++. NET имеют в Microsoft огромные команды, которые работают над тем, чтобы их компиляторы создавали максимально быстрый байт-код.IronPython и Boo являются добровольными проектами, в которых не так много рабочей силы или ресурсов, поэтому они не будут получать оптимизацию так же быстро, как что-то, финансируемое MS.и время компиляции и время выполнения.Вот почему языки .NET отличаются по производительности;потому что они различаются по функциям.

8 голосов
/ 28 июня 2011

Все ответы до сих пор путали C ++ и "C ++ .Net" (который сейчас фактически называется C ++ / CLI ) - это два совершенно разных языка.

C ++ компилируется в машинный код. C ++ / CLI компилируется в CIL (.Net) байт-код. Из-за этого программы на C ++ будут иметь тенденцию работать немного быстрее, чем код на C ++ / CLI. C ++ около 30 лет, и он широко используется в мире программирования. C ++ / CLI, с другой стороны, около 10 лет и широко не используется. Его основная цель - значительно упростить перевод программ C ++ на .Net - переход с C ++ на C ++ / CLI намного меньше, чем переход с C ++ на C #.

Есть еще одна путаница в одном из ваших комментариев выше: между VB6 и VB.Net. VB6 был старым языком VB от Microsoft, теперь он устарел. Он был скомпилирован в машинный код, хотя было распространенное мнение (в основном это правда), что он медленнее, чем C ++. VB.Net - новый язык VB от Microsoft, скомпилированный в CIL.

Теперь: производительность. C ++ обычно будет самым быстрым, просто потому, что он скомпилирован с собственным машинным кодом, и потому, что люди работают над оптимизацией его компиляторов в течение 30 лет. Это то, что вы обычно видите в видеоиграх и других высокопроизводительных приложениях, написанных на них, но, по сравнению с другими языками, работать с ними довольно сложно.

Между языками .Net два больших языка - C # и VB.Net - в основном одинаковы с точки зрения производительности. Хотя у меня нет никаких тестов, чтобы доказать это, я бы предположил , что C ++ / CLI на самом деле немного медленнее , просто потому, что Microsoft не уделяет такого языка особого внимания, так что, вероятно, не так много программистов работают над оптимизацией его компилятора.

IronPython, поскольку у него нет штатной команды, работающей над оптимизацией своего компилятора, вероятно, будет самым медленным. Он также работает над DLR , который является еще одним уровнем косвенности. Кроме того, в другом ответе говорится, что он интерпретируется, что может привести к снижению производительности.

7 голосов
/ 28 июня 2011

Имейте в виду, что в отличие от C # или VB.Net не все программы на C ++, созданные в Visual Studio .Net, используют .Net Framework. С его помощью вы также можете создавать прямые программы на C ++, которые довольно быстрые.

1 голос
/ 28 июня 2011

Следование инстинктам C ++ в C ++ / cli приведет к более быстрому коду, чем использование инстинктов C # в C #, например, при циклическом просмотре данных.Конечно, вы МОЖЕТЕ использовать небезопасный код C # для выполнения той же задачи, и вы МОЖЕТЕ использовать массивы в C ++ / cli, но если вместо этого вы будете следовать достаточно стандартным языковым парадигмам, при правильных обстоятельствах может быть огромная разница в производительности, например, 10 к 1 втесная петля с большим количеством доступа к данным.

Парадигма C ++ в C ++ / cli

char * position = start;
char * end = position + data_count;
while ( position < start ) {
     { do stuff with the data )
     position ++;
}

Парадигма C #

for ( int i = 0 ; i < count; i ++ ) {
    { do stuff with data[i] )
}

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

Помимо этих проблем парадигмы программирования могут быть и проблемы с компилятором, но я ничего о них не знаю.

1 голос
/ 28 июня 2011

Иногда операции, которые кажутся эквивалентными, могут фактически потребовать небольшой дополнительной работы (выполняемой автоматически компилятором) для соответствия требованиям языка.Например, в VB есть причуды, например, всякий раз, когда вы ловите исключение, он обновляет Err object ;всякий раз, когда вы что-либо делаете с переменной Object, она вызывает функцию , которая делает копию в случае, если это тип значения.

...