Разработка математических библиотек - PullRequest
2 голосов
/ 21 июля 2009

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

Одна мысль состоит в том, чтобы создать математическую библиотеку в C ++ и ссылаться на эту DLL в проекте C #. Мне интересно, стоит ли это усилий?

Ответы [ 5 ]

6 голосов
/ 21 июля 2009

Общее правило: « не оптимизируйте до тех пор, пока вам не понадобится », поэтому я бы предпочел просто написать его на C # и оптимизировать код позже.

Но в этой ситуации, когда оптимизация может потребовать переопределения всего на другом языке, я бы сначала провёл некоторое тестирование. Напишите небольшое приложение с использованием математики с наибольшей нагрузкой на процессор, которую вы ожидаете как в C #, так и в C ++, а затем сравните время, чтобы понять, является ли C # приемлемым.

5 голосов
/ 21 июля 2009

Если вы будете использовать его в C #, то вы также можете поместить его в C # для начала. Вы покупаете больше с управляемым кодом, чем экономите с обработкой указателей. Если вас беспокоят проблемы с памятью и кешем, просто используйте массивы типов вместо объектов. Это дает вам больше контроля над памятью.

Оптимизаторы и JIT-компиляторы купят вам более чем достаточную скорость, чтобы компенсировать любую неэффективность.

1 голос
/ 21 июля 2009

Следует иметь в виду, что использование языков байт-кода, таких как C # или Java, позволяет JIT-компилятору во время выполнения оптимизировать ваш код. На практике это означает, что производительность вашего кода во время выполнения только улучшается со временем . В отличие от C ++, где машинный код создается один раз во время компиляции и никогда не изменяется, производительность вашего кода C # может непрерывно улучшаться вместе с улучшениями базового JIT-компилятора.

В наши дни серьезное исследование посвящено технологии JIT-компиляторов. Воспользоваться этим сейчас - отличный подход.

1 голос
/ 21 июля 2009

Немного сложно сказать что-то однозначное, так или иначе. Я бы предложил придерживаться C #, если это то, что вы начали или на чем основывается остальная часть вашего проекта. Держите в стороне некоторые канонические наборы данных и устанавливайте некоторые контрольные показатели по мере разработки. Если вы обнаружите, что производительность падает ниже некоторого неприемлемого порога, и ваше профилирование заставляет вас думать, что проблема присуща C #, тогда напишите компонент C ++ для решения этих конкретных задач.

0 голосов
/ 02 ноября 2009

Одна из причин, по которой мне нравится использовать C # для числового программирования, заключается в том, что он довольно легко взаимодействует с нативным кодом. C # и новейшие среды выполнения .NET и JIT-компиляторы чертовски хороши, но иногда вы просто не можете превзойти высокооптимизированный нативный код. Например, вот что я сделал для линейной алгебры. Напишите несколько хороших объектно-ориентированных классов, которые скрывают реализацию ключевых операций. Для меня это означало создание классов Matrix и Vector с функциями / операторами сложения и умножения. Когда я столкнулся с алгоритмом, который должен был выполнять несколько матриц-матричных продуктов и транспонировать продукты с довольно большими матрицами (тысячи строк на сотни столбцов) в течение многих итераций, все происходило слишком медленно. Я повторно реализовал функцию умножения матриц, чтобы вызвать высокооптимизированную функцию умножения матриц-матриц из библиотеки Intel Math Kernel (dgemm). Это дало мне скорость, превышающую скорость в 20 раз. Кроме того, неприятный API для этой нативной процедуры (dgemm принимает не менее 13 параметров!) Был скрыт от пользователей класса матрицы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...