我希望为我正在处理的项目创建一个自定义数学库。该项目是用C#编写的,我有点担心C#是否足够快。该库将具有许多自定义数学公式和等式,以应用于非常大的数据集。模拟和矩阵运算也将完成(即蒙特卡罗模拟),因此它必须很快。
一种想法是用C ++创建数学库并在C#项目中引用这个.dll。我想知道这是否值得付出努力?
答案 0 :(得分:6)
一般的经验法则是“在你需要之前不要进行优化”,所以我倾向于只用C#编写它并稍后优化代码。
但是,在这种情况下,优化可能需要重新实现另一种语言的所有内容,我会先做一些测试。使用C#和C ++中预期的处理器密集型数学编写一个小应用程序,然后比较时间以查看C#是否可以接受。
答案 1 :(得分:5)
如果你将在C#中使用它,那么你也可以把它放在C#中开始。使用托管代码购买的数量超过使用指针争吵保存的数量。如果您担心内存和缓存问题,那么只需使用类型数组而不是对象。它使您可以更好地控制内存的布局方式。
优化器和JIT编译器会以足够的速度为您购买,以弥补任何低效率。
答案 2 :(得分:1)
说出一种确定的方式有点困难。我建议坚持使用C#,如果这是你已经开始的或你的项目的其余部分是基于什么。保留一些规范数据集,并在开发时建立一些基准。如果您发现性能低于某个不可接受的阈值,并且您的分析使您认为问题是C#固有的,那么编写C ++组件来解决这些特定需求。
答案 3 :(得分:1)
要记住的一点是,使用C#或Java等字节码语言可以让运行时的JIT编译器优化您的代码。实际上,这意味着代码的运行时性能只会随着时间的推移而变得更好。与C ++不同的是,机器代码在编译时生成一次并且永远不会发生变化,C#代码的性能可以不断提高,并且对底层JIT编译器也有所改进。
目前,JIT编译器技术正在进行大量研究。现在利用这一点是一种很好的方法。
答案 4 :(得分:0)
我喜欢使用C#进行数值编程的原因之一是与本机代码交互相当容易。 C#和最新的.NET运行时和JIT编译器相当不错,但有时你无法击败高度优化的本机代码。例如,这是我为线性代数做的事情。编写一些很好的面向对象的类来隐藏关键操作的实现。对我来说,这意味着使用加法和乘法函数/运算符创建Matrix和Vector类。当我遇到一个必须执行多个matrx-matrix产品的算法,并且在多次迭代中转换具有相当大的矩阵(数千行乘数百列)的产品时,事情变得太慢了。我重新实现了矩阵乘法函数,从英特尔的数学核心库(dgemm)调用高度优化的矩阵乘法函数。这让我的速度提高了20倍。加上这个原生例程的令人不快的API(dgemm接受不少于13个参数!)对矩阵类的用户是隐藏的。
因此,我建议您在库中使用C#,并在需要的时间和地点下载到优化的本机代码。