Прежде всего, широкий спектр языков на платформе .NET определенно содержит языки, которые генерируют код с разной производительностью, поэтому не все языки одинаково производительны. Все они компилируются на один и тот же промежуточный язык (IL), но сгенерированный код может отличаться, некоторые языки могут полагаться на Reflection или динамический язык исполнения (DLR) и т. Д.
Однако верно, что BCL (и другие библиотеки, используемые языками) будут иметь одинаковую производительность независимо от того, с какого языка вы их называете - это означает, что если вы используете какую-то библиотеку, которая выполняет дорогостоящие вычисления или рендеринг без выполняя сложные вычисления самостоятельно, не имеет значения, на каком языке вы его называете.
Я думаю, что лучший способ думать о проблеме - это не думать о языках, а о различных функциях и стилях программирования, доступных на этих языках. Ниже перечислены некоторые из них:
Небезопасный код : Вы можете использовать небезопасный код в C ++ / CLI и до некоторой степени также в C #. Это, вероятно, самый эффективный способ написания определенных операций, но вы теряете некоторые гарантии безопасности.
Статически типизированный, императив : Это обычный стиль программирования в C # и VB.Net, но вы также можете использовать императивный стиль из F #. Примечательно, что многие хвостовые рекурсивные функции компилируются в статически типизированный императивный код IL, поэтому это также относится к некоторым функциям F #
Статически типизированный, функциональный : используется большинством программ F #. Сгенерированный код в значительной степени отличается от того, что используется в категории imperative , но он по-прежнему статически типизирован, поэтому значительных потерь производительности нет. Сравнивать императив и функционал довольно сложно, так как оптимальная реализация выглядит совершенно по-разному в обеих версиях.
Динамически типизированный : Языки, такие как IronPython и IronRuby, используют динамический язык исполнения, который реализует динамические вызовы методов и т. Д. Это несколько медленнее, чем статически типизированный код (но DLR оптимизирован во многих отношениях). Обратите внимание, что код, написанный с использованием C # 4.0 dynamic
, также попадает в эту категорию.
Существует много других языков, которые могут не войти ни в одну из этих категорий, однако я считаю, что приведенный выше список охватывает большинство распространенных случаев (и определенно охватывает все языки Microsoft).