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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
59
0
34 937
3

Ответы 3

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

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

Обратное также верно, если вы пользуетесь уникальными функциями F#, такими как inline.

J D 21.04.2010 19:20

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

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

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

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

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

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

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

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

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

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

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

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

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

Marc Gravell 03.01.2010 01:06

«Обычно это требует кодирования в императивном или изменяемом объектно-ориентированном стиле». Нет, вам нужна мутация для повышения производительности, но вы должны использовать объектно-ориентированный стиль избегать в пользу стиля Fortran. ООП тоже медленный ...

J D 29.03.2011 02:27

Если им действительно нужна скорость, я думаю, им стоит больше думать о языке ассемблера.

Little Jack 05.09.2011 19:51

что такое ссылки (по сравнению с переменными экземпляра класса)?

colinfang 01.05.2013 18:04

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

Bent Tranberg 16.09.2015 10:10

@BentTranberg Неправильно. Языки определяют концепции, которые затем необходимо сопоставить с программами, работающими на реальном оборудовании. Некоторые из этих концепций труднее реализовать, чем другие. Например, если бы я разработал язык с одной инструкцией для автоматического понимания и решения любой проблемы, это было бы не только почти невозможно реализовать, но и очень, очень, ОЧЕНЬ медленно; и это не проблема компилятора, это проблема языка.

Arshia001 06.02.2019 10:39

БентТранберг прав. Arshia001 тоже. Конечно, языку не присущи характеристики; это зависит от оптимизаций, которые может сделать компилятор. В то же время очевидно, что императивный язык легче оптимизировать, потому что он больше похож на то, как работает аппаратное обеспечение. Вот почему функциональный язык не использовался в реальной индустрии в течение многих лет. Haskell - хороший пример этого изменения, поскольку его компилятор может выполнять чудовищные оптимизации, компилируя код почти до скорости C.

Mateus Felipe 13.09.2019 15:45

Другие вопросы по теме