当前位置:  开发笔记 > 编程语言 > 正文

我需要高性能.如果我使用C或C++会有区别吗?

如何解决《我需要高性能.如果我使用C或C++会有区别吗?》经验,为你挑选了5个好方法。

我需要编写一个程序(大学项目)来解决(近似)NP难题.它是线性排序问题的变体.一般来说,我将有非常大的输入(如图形),并将尝试找到最佳解决方案(基于一个"评价"每个解决方案的功能)

如果我用C风格的代码(一个main和函数)编写它,或构建一个Solver类,创建一个实例并从main调用一个'run'方法(类似于Java),会有区别吗

此外,每次迭代都会有很多浮点运算.

谢谢!



1> nos..:

没有.

最大的性能提升/缺陷将取决于您实现的算法,以及您执行的不必要的工作量(不需要的工作可能是重新计算可能已缓存的先前值,使用太多malloc/free和使用内存池,通过值而不是引用传递大的不可变数据


@Juliet:实际上,没有.对于小问题集,O(n ^ 2)算法可能比O(log n)或甚至O(1)算法更快.例如,在链表上进行线性,O(n)搜索的10或15个元素的关联比使用哈希表(O(1)更快(如果你的问题包括做很多很多操作)在小关联上,链表可能比使用哈希表快得多.big-O复杂性仅涉及*large*数据集的性能特征.
+1:OP描述了解决NP难题,因此真正的瓶颈是计算复杂性,而不是语言速度.对于甚至小的问题集,Python中的O(log n)算法每次都会在C中击败O(n ^ 2)算法.计算复杂性将使用语言X而不是语言Y获得的微小常数性能因素相形见绌.
如果你看一下语言大战,你会发现C和C++之间的差别很小.

2> Reverend Gon..:

优化代码的最大障碍不再是语言(对于正确编译的语言),而是程序员.



3> int3..:

不,除非您使用虚拟功能.

编辑:如果你有一个需要运行时动态的情况,那么是的,虚函数比手动构造的if-else语句快或快.但是,如果您在virtual方法前放入关键字,但实际上并不需要多态,那么您将支付不必要的开销.编译器不会在编译时对其进行优化.我只是指出这一点,因为它是C++的一个特性,打破了"零开销原则"(引用Stroustrup).

作为旁注,因为你提到大量使用fp数学:

下面的GCC标志可以帮助你加快速度(我敢肯定有视觉C++等同的,但我不使用它)-mfpmath=sse,-ffast-math-mrecip(最后两个是"轻微危险",这意味着他们可以给你奇怪的结果是在边缘情况下换取速度.第一种是精确度降低了一点 - 你有64位双精度而不是80位双精度 - 但这种额外的精度通常是不需要的.)这些标志同样有效用于C和C++编译器.

根据您的处理器,您可能还会发现,INFINITY使用大但非无限值模拟true 会为您提供良好的速度提升.这是因为INFINITY处理器必须将其作为特殊情况处理.


这是关于虚拟游戏的愚蠢评论.如果你需要它们,你需要它们.在C中实现等效的虚函数将与编译器在C++中生成的函数一样昂贵.不同之处在于,C++中编译器生成的编译器更可能是正确的,并且将有10年的编译器优化技巧.

4> BostonLogan..:

经验法则 - 在知道要优化的内容之前不要进行优化.所以从C++开始,有一些工作原型.然后对其进行分析并重新组装瓶颈.但正如其他人所指出的,选择的算法将比语言产生更大的影响.



5> Bastien Léon..:

在谈到性能时,可以用C++完成C语言中的所有操作.例如,已知虚拟方法"慢",但如果确实存在问题,您仍然可以使用C语言.

C++还带来了模板,void*与通用编程相比,它可以带来更好的性能.


++如果虚拟函数是你真正需要的东西,那么它们在任何一种语言中的工作速度都一样快.它们在C++中只是有点漂亮.无论如何,在您注意到虚拟和非虚拟功能之间的差异之前,代码必须非常非常紧密.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有