Есть ли сравнение производительности производительности С#/F # в Интернете, чтобы показать правильное использование нового языка F #?
С#/F # Сравнение производительности
Ответ 1
Естественный код F # (например, функциональный/неизменный) медленнее, чем естественный (обязательный/изменяемый объектно-ориентированный) код С#. Однако этот вид F # намного короче обычного кода на С#. Очевидно, есть компромисс.
С другой стороны, вы можете в большинстве случаев достичь производительности кода F #, равного производительности кода С#. Обычно это требует кодирования в императивном или изменяемом объектно-ориентированном стиле, профиле и устранении узких мест. Вы используете те же инструменты, которые в противном случае вы использовали бы на С#: например..Net рефлектор и профилировщик.
Что, сказав, что стоит помнить о некоторых высокопроизводительных конструкциях в F #, которые снижают производительность. По моему опыту я видел следующие случаи:
-
(переменные экземпляра класса), только в коде, выполняемом миллиардами раз
-
Сравнение F # (< =) по сравнению с System.Collections.Generic.Comparer, например, в двоичном поиске или сортировке
-
tail calls - только в некоторых случаях, которые не могут быть оптимизированы компилятором или .Net runtime. Как отмечается в комментариях, это зависит от времени выполнения .NET.
-
Последовательности F # в два раза медленнее, чем LINQ. Это связано с ссылками и использованием функций в библиотеке F # для реализации перевода seq < _ > . Это легко устранить, поскольку вы можете заменить модуль Seq одним сигналом, который использует Linq, PLinq или DryadLinq.
-
Кортежи, F # tuple - это класс, отсортированный по куче. В некоторых случаях, например, int int int он может заплатить за использование структуры.
-
Выделение, стоит помнить, что закрытие - это класс, созданный с помощью нового оператора, который запоминает доступные переменные. Возможно, стоит "снять" закрытие или заменить его функцией, которая явно принимает переменные доступа в качестве аргументов.
-
Попробуйте использовать inline для повышения производительности, особенно для общего кода.
Мой опыт состоит в том, чтобы сначала закодировать F # и оптимизировать только те части, которые имеют значение. В некоторых случаях легче написать медленные функции в С#, чтобы попытаться настроить F #. Однако, с точки зрения эффективности программы, имеет смысл запустить/прототип в F #, затем профиль, разобрать и оптимизировать.
В нижней строке, ваш код F # может оказаться более медленным, чем С#, из-за решений по разработке программ, но в конечном итоге эффективность может быть достигнута.
Ответ 2
Посмотрите на эти вопросы, которые я недавно спросил:
Ответ 3
Вот несколько ссылок (или связанных с) этой теме:
- http://cs.hubfs.net/forums/thread/3207.aspx
- http://strangelights.com/blog/archive/2007/06/17/1588.aspx
- http://khigia.wordpress.com/2008/03/30/ocaml-vs-f-for-big-integer-surprising-performance-test/
- http://cs.hubfs.net/blogs/f_team/archive/2006/08/15/506.aspx
- http://blogs.msdn.com/jomo_fisher/
Что я, кажется, помню из другого сообщения в блоге Роберта Пикеринга (или это был Scott Hanselman?), который в конце концов, потому что оба сидят в одном каркасе, вы можете получить ту же производительность от обоих, но иногда для "поворота" естественного выражения языка для этого. В примере, который я помню, ему пришлось перекручивать F #, чтобы получить сопоставимую производительность с С#...