我需要编写一个程序(大学项目)来解决(近似)NP难题.它是线性排序问题的变体.一般来说,我将有非常大的输入(如图形),并将尝试找到最佳解决方案(基于一个"评价"每个解决方案的功能)
如果我用C风格的代码(一个main和函数)编写它,或构建一个Solver类,创建一个实例并从main调用一个'run'方法(类似于Java),会有区别吗
此外,每次迭代都会有很多浮点运算.
谢谢!
没有.
最大的性能提升/缺陷将取决于您实现的算法,以及您执行的不必要的工作量(不需要的工作可能是重新计算可能已缓存的先前值,使用太多malloc/free和使用内存池,通过值而不是引用传递大的不可变数据
优化代码的最大障碍不再是语言(对于正确编译的语言),而是程序员.
不,除非您使用虚拟功能.
编辑:如果你有一个需要运行时动态的情况,那么是的,虚函数比手动构造的if-else
语句快或快.但是,如果您在virtual
方法前放入关键字,但实际上并不需要多态,那么您将支付不必要的开销.编译器不会在编译时对其进行优化.我只是指出这一点,因为它是C++的一个特性,打破了"零开销原则"(引用Stroustrup).
作为旁注,因为你提到大量使用fp数学:
下面的GCC标志可以帮助你加快速度(我敢肯定有视觉C++等同的,但我不使用它)-mfpmath=sse
,-ffast-math
和-mrecip
(最后两个是"轻微危险",这意味着他们可以给你奇怪的结果是在边缘情况下换取速度.第一种是精确度降低了一点 - 你有64位双精度而不是80位双精度 - 但这种额外的精度通常是不需要的.)这些标志同样有效用于C和C++编译器.
根据您的处理器,您可能还会发现,INFINITY
使用大但非无限值模拟true 会为您提供良好的速度提升.这是因为INFINITY
处理器必须将其作为特殊情况处理.
经验法则 - 在知道要优化的内容之前不要进行优化.所以从C++开始,有一些工作原型.然后对其进行分析并重新组装瓶颈.但正如其他人所指出的,选择的算法将比语言产生更大的影响.
在谈到性能时,可以用C++完成C语言中的所有操作.例如,已知虚拟方法"慢",但如果确实存在问题,您仍然可以使用C语言.
C++还带来了模板,void*
与通用编程相比,它可以带来更好的性能.