Подтвердить что ты не робот

Почему языки .net различаются по производительности?

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

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

4b9b3361

Ответ 1

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

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

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

По сути, языковые функции могут иметь затраты на производительность и память как во время компиляции, так и во время выполнения. Вот почему языки .NET отличаются по производительности; потому что они различаются по функциям.

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Парадигма С#

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

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

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