C # / F # Сравнение производительности

Есть ли сравнение производительности C # / F # в Интернете, чтобы показать правильное использование нового языка F #?

Естественный код F # (например, функциональный / неизменный) медленнее, чем естественный (обязательный / изменяемый объектно-ориентированный) код C #. Однако этот вид F # намного короче обычного кода на C #. Очевидно, есть компромисс.

С другой стороны, вы можете в большинстве случаев достичь производительности кода F #, равного производительности кода C #. Обычно это требует кодирования в императивном или изменяемом объектно-ориентированном стиле, профиле и устранении узких мест. Вы используете те же инструменты, которые в противном случае вы использовали бы в C #: например, отражатель .Net и профилировщик.

При этом, говоря о планах, следует помнить о некоторых высокопроизводительных конструкциях в F #, которые снижают производительность. По моему опыту я видел следующие случаи:

  • ссылки (переменные экземпляра classа), только в коде, выполняемом миллиардами раз

  • Сравнение F # (<=) и System.Collections.Generic.Comparer, например, в двоичном поиске или сортировке

  • tail – только в определенных случаях, которые не могут быть оптимизированы компилятором или .Net runtime. Как отмечается в комментариях, это зависит от времени выполнения .Net.

  • Последовательности F # в два раза медленнее, чем LINQ. Это связано с ссылками и использованием функций в библиотеке F # для реализации перевода seq <_>. Это легко устранить, поскольку вы можете заменить модуль Seq одним сигналом, который использует Linq, PLinq или DryadLinq.

  • Кортежи, кортеж F # – это class, отсортированный по куче. В некоторых случаях, например, int * int кортеж, он может заплатить за использование структуры.

  • Выделение, стоит помнить, что закрытие – это class, созданный с помощью нового оператора, который запоминает доступные переменные. Возможно, стоит «снять» закрытие или заменить его функцией, которая явно принимает переменные доступа в качестве аргументов.

  • Попробуйте использовать встроенную линию для повышения производительности, особенно для общего кода.

Мой опыт состоит в том, чтобы сначала кодировать в F # и оптимизировать только те части, которые имеют значение. В некоторых случаях легче написать медленные функции в C #, чтобы попытаться настроить F #. Однако, с точки зрения эффективности программы, имеет смысл запустить / прототип в F #, затем профиль, разобрать и оптимизировать.

Итог, ваш код F # может оказаться более медленным, чем C #, из-за решений по разработке программы, но в конечном итоге эффективность может быть достигнута.

См. Эти вопросы, которые я недавно спросил:

  • Является ли программа F # более эффективной (по исполнению), чем C #?
  • Как я могу использовать функциональное программирование в реальном мире?
  • Возможно ли, что F # будет оптимизировано больше, чем другие языки .Net в будущем?

Вот несколько ссылок на эту тему (или связанные с ней):

Что я, кажется, помню из другого сообщения в блоге Роберта Пикеринга (или это был Скотт Гензельман?), Который в конце концов, потому что оба сидят в одной и той же структуре, вы можете получить ту же производительность от обоих, но иногда вам приходится «крутить» «естественное выражение языка для этого. В примере, который я помню, ему пришлось перекручивать F #, чтобы получить сопоставимую производительность с C # …

  • Производительность селектора jQuery с контекстом
  • Заголовок Content-Length по сравнению с закодированным кодированием
  • R: ускорение операций «по группам»
  • Эффективность: массивы против указателей
  • Сколько накладных расходов на интеллектуальные указатели по сравнению с обычными указателями на C ++?
  • Redis в 10 раз больше использования памяти, чем данные
  • Android - предотrotation белого экрана при запуске
  • Эффективные C ++ строки (интернирование, веревки, копирование на запись и т. Д.)
  • arrayfun может быть значительно медленнее, чем явный цикл в matlab. Зачем?
  • Является ли это очень важным для производительности?
  • Когда использовать StringBuilder в Java
  • Давайте будем гением компьютера.