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