3

我需要编写能够进行大量数学运算的软件。大多数情况下,它将是与整数的矩阵乘法来计算 DCT。与 VB .Net 相比,我应该期望代码在本机 c 中运行多快?2 倍,10 倍,1000 倍……?有人尝试并收集了这方面的统计数据吗?

4

3 回答 3

1

.Net 代码在执行前被 JIT 编译为本机代码,因此它通常不应该比本机代码慢。我期望一个因子< 10。

此外,自适应优化技术在代码运行时对其进行分析,比典型的静态编译器获得更多信息。因此,JIT 可以做出更明智的决策以进行进一步优化

于 2010-03-04T13:41:46.173 回答
0

.NET 代码由 JIT 编译器编译为本机代码,因此在这两种情况下您都可以获得本机代码。

不同之处在于 C 代码在计算方面的开销要少一些,因此您应该期望性能差异为 2 倍。

于 2010-03-04T13:39:53.917 回答
0

VB 比 C 快 93.7%。如果你选择了正确的场景。

实际上,如果您的“本机 C”包括对 malloc() 和 free() 的常规调用,那么任何类型的 Gargage Collected 语言(如 VB.Net)都会绕着它转圈。在你的内部循环中,GC 可以比 malloc 快 10 倍。

如果您分解并使用 C,请尝试重用您仅声明一次的结构而不是创建新结构,以避免此问题。如果您的解决方案适合它,即使在 VB 中,这也可能是有益的。但是它会更难编程,而且 GC 非常快。

就边界/溢出检查而言,如果速度很重要并且测试表明它们不会发生,并且您不会因错误或异常终止而冒生命或数百万美元的风险,那么它们就是浪费时间。但是,如果您无法摆脱它们,那么您的时间可能在您可以更快编程的语言中仍然更有价值。

如果您期望严重的大小和使用情况,则使用控制程序拆分任务并将分配的“任务定义”存储到共享目录中,每个任务解决程序或数据库都有一个文件,这是值得的。然后,您可以为每个处理器(每个 HT CPU 2 个)或网络计算机运行一个求解器。对队列结构感到厌烦——原子地“标记-获取-获取-数据-如果-未获取”是很困难的。你知道你要开始多少个任务解决者。我使用自己开发的成像实用程序完成了这项工作,它比预期的要容易得多,并且它完善了以前的版本。另外,如果您使用具有可适当划分的问题域的多个进程,则可以避免多线程的轻微到显着的编程负担。或者让你的同事相信你的花括号在正确的位置。和平。

于 2010-03-05T21:08:02.137 回答