DLL在多大程度上加速了诸如循环等代码中的计算

时间:2015-08-08 18:34:55

标签: c++ vb.net visual-studio-2012 dll

我有一个循环计数为10000000000的代码,并且在该循环中,我使用条件运算符(如果等)进行一些计算。达到这个数字大约需要5分钟。所以,我的问题是,我可以通过创建DLL并调用该函数来执行计算并将值返回到主程序来减少所需的时间吗?它会对计算所需的时间产生影响吗?此外,它会提高该计划的整体效率吗?

2 个答案:

答案 0 :(得分:0)

通过“dll”,我假设您的意思是从托管的.net代码转到未托管的“本机”编译代码。是的,这种方法可以提供帮助。

这很大程度上取决于。请记住,循环代码的速度在典型的i3上可能只有25秒(这是成本和开销,以循环到100亿,但没有做任何其他事情)。

我假设你去了项目,然后编译。在该屏幕上选择高级编译。你想检查删除整数溢出检查。确保循环变量是整数以提高速度。

此时,什么都不做的“基础”循环将从大约20秒下降到大约6秒。

这就是基本循环速度 - 现在它归结为我们在该循环中所做的事情。

此时,.net确实有一个JIT(一个及时的原生编译器)。这意味着您的源代码转到“CLR”代码,然后代码确实编译为本机x86汇编代码。所以这“确实”将源代码下载到REAL机器代码级别。然而,JIT肯定不是那么高效,也不能花时间“优化”代码,因为JIT必须在没有你注意到的情况下处理“飞行”。因此,c ++(或者在本机编译时运行速度与c ++一样快的VB6)肯定可以运行得更快,但问题是多少呢?

优化的编译器可能会为实际的LOOPING代码等获得另一倍的速度。

然而,在两种情况下(使用.net托管代码,或编译为本机英特尔代码的代码),他们可以同时调用SAME例程进行数学计算!

换句话说,如果80%的代码花费在进行数学运算等的“库”代码中,那么从c ++调用这样的代码或从.net调用这样的代码将会因为BULK的大小而变得非常小。工作花在相同的系统代码上!

上述概念实际上是“主管”模式与您的应用模式相比。

换句话说,在代码中花费的时间与使用系统“库”代码的时间相比,意味着大量的起伏提升发生在管理员代码中。这意味着从.net跳转到本机c ++ / vb6 dll将不会产生太多的性能。

所以我首先要确保代码中的循环和数组索引引用是整数类型。上面的取消边界检查的提示可能会让你“接近”使用.dll。更糟糕的是,通常是“洗牌”数据的时间,而且来自external.dll子的时间将比处理端节省的时间花费更多。

如果你的例程正在做数据库或文件i / o,那么所有的赌注都会关闭,因为这是非常不同的问题。

所以我首先测试/尝试你的应用程序,并关闭[x]删除整数溢出检查。并且在测试期间确保使用ctrl-F5代替F5来运行代码而不进行DEBUGGING。在调试模式下,上述溢出检查和选项不会显示增加的速度。

所以很难说 - 这实际上取决于你正在做多少数学(特别是浮动调用)(管理员代码)与仅仅在数组中移动数值。如果更多的代码正在移动,那么我建议上面的整数优化,并且转换为.dll可能无济于事。

答案 1 :(得分:0)

难道你不能利用“Parallel.ForEach”并将这个巨大的循环剥离出来吗?

或尝试使用一些Backgroundworkers甚至Threads(超过1 !!)来实现最佳CPU性能并尝试减少花费的时间。