Мне интересно, как производительность F # сравнивается с производительностью C ++?
Дико меняется в зависимости от приложения. Если вы интенсивно используете сложные структуры данных в многопоточной программе, то F #, вероятно, будет большой победой. Если большая часть вашего времени тратится на сжатие числовых циклов, мутирующих массивов, то C ++ может быть в 2-3 раза быстрее.
Пример: трассировщик лучей Мой тест здесь использует дерево для иерархической выборки и числовой код пересечения лучевой сферы для генерации выходного изображения. Этому бенчмарку уже несколько лет, и код C ++ совершенствовался десятки раз за эти годы и читался сотнями тысяч людей. Дон Сайм из Microsoft сумел написать реализацию F #, которая немного быстрее , чем самый быстрый код C ++ при компиляции с MSVC и распараллеливании с использованием OpenMP.
Я читал, что F # должен быть более масштабируемым и более производительным, но как эта реальная производительность сравнивается с C ++?
Разработка кода намного проще и быстрее с F #, чем C ++, и это относится как к оптимизации, так и к обслуживанию. Следовательно, когда вы начнете оптимизировать программу, тот же объем усилий даст гораздо больший прирост производительности, если вы будете использовать F # вместо C ++. Тем не менее, F # является языком более высокого уровня и, следовательно, устанавливает более низкий потолок производительности. Поэтому, если у вас есть бесконечное время на оптимизацию, вы, теоретически, должны всегда иметь возможность создавать более быстрый код на C ++.
Это точно то же преимущество, которое C ++ имел по сравнению с Fortran, а Fortran, конечно, по сравнению с рукописным ассемблером.
Пример: QR-декомпозиция Это базовый численный метод линейной алгебры, предоставляемый такими библиотеками, как LAPACK. Эталонная реализация LAPACK - 2077 строк Fortran. Я написал реализацию F # в менее чем 80 строках кода, которая обеспечивает тот же уровень производительности. Но эталонная реализация не быстрая: настроенные производителем реализации, такие как Math Kernel Library (MKL) от Intel, часто бывают в 10 раз быстрее. Примечательно, что мне удалось оптимизировать мой код F # на 1027 * больше, чем производительность реализации Intel, работающей на аппаратном обеспечении Intel, при этом мой код не превышал 150 строк кода и полностью универсален (он может обрабатывать одинарную и двойную точность, а также сложный и четные символьные матрицы!): для высоких тонких матриц мой код F # в 3 раза быстрее, чем Intel MKL.
Обратите внимание, что мораль этого примера не в том, что вы ожидаете, что ваш F # будет быстрее, чем в библиотеках, настроенных вендором, а в том, что даже такие эксперты, как Intel, упустят продуктивные высокоуровневые оптимизации, если они будут использовать только низкоуровневые языки. Я подозреваю, что эксперты Intel по численной оптимизации не смогли полностью использовать параллелизм, потому что их инструменты делают его чрезвычайно громоздким, тогда как F # делает его легким.
Насколько хорошо он работает с плавающей запятой?
Производительность аналогична ANSI C, но некоторые функции (например, режимы округления) недоступны в .NET.
Позволяет ли векторная инструкция
номер
Насколько дружественна оптимизация компиляторов?
Этот вопрос не имеет смысла: F # является проприетарным языком .NET от Microsoft с одним компилятором.
Насколько большой отпечаток памяти у него есть?
Пустое приложение использует 1,3 Мбайт здесь.
Позволяет ли он детально контролировать локальность памяти?
Лучше, чем большинство языков, безопасных для памяти, но не так хорошо, как C. Например, вы можете распаковать произвольные структуры данных в F #, представив их как «структуры».
имеет ли он емкость для процессоров с распределенной памятью, например Cray?
Зависит от того, что вы подразумеваете под «способностью к». Если вы можете запустить .NET на этом Cray, тогда вы можете использовать передачу сообщений в F # (как и в следующем языке), но F # предназначен главным образом для настольных многоядерных машин x86.
Какие функции он может представлять интерес для вычислительной науки, где участвует обработка больших чисел?
Безопасность памяти означает, что вы не получаете ошибок сегментации и нарушений доступа. Поддержка параллелизма в .NET 4 хороша. Возможность выполнять код на лету через интерактивный сеанс F # в Visual Studio 2010 чрезвычайно полезна для интерактивных технических вычислений.
Существуют ли реальные научные вычислительные реализации, которые его используют?
Наши коммерческие продукты для научных вычислений на F # уже имеют сотни пользователей.
Однако ваша линия вопросов указывает на то, что вы думаете о научных вычислениях как о высокопроизводительных вычислениях (например, Cray), а не о интерактивных технических вычислениях (например, MATLAB, Mathematica). F # предназначен для последнего.