C++ 我需要高性能。如果我使用C或C++;?

C++ 我需要高性能。如果我使用C或C++;?,c++,c,performance,np-hard,C++,C,Performance,Np Hard,我需要写一个程序(一个大学项目)来解决一个NP难问题。 它是线性排序问题的一种变体。 一般来说,我会有非常大的输入(如图),并会尝试找到最佳解决方案 (基于对每个解决方案进行“评分”的函数) 如果我用C风格的代码(一个main和函数)编写,会有什么不同吗 或者构建一个解算器类,创建一个实例并从main调用一个“run”方法(类似于Java) 此外,在每次迭代中都会有大量的浮点运算 谢谢 没有 最大的性能增益/缺陷在于您实现的算法,以及您执行了多少不必要的工作(不必要的工作可能包括重新计算以前可能

我需要写一个程序(一个大学项目)来解决一个NP难问题。 它是线性排序问题的一种变体。 一般来说,我会有非常大的输入(如图),并会尝试找到最佳解决方案 (基于对每个解决方案进行“评分”的函数)

如果我用C风格的代码(一个main和函数)编写,会有什么不同吗 或者构建一个解算器类,创建一个实例并从main调用一个“run”方法(类似于Java)

此外,在每次迭代中都会有大量的浮点运算

谢谢

没有

最大的性能增益/缺陷在于您实现的算法,以及您执行了多少不必要的工作(不必要的工作可能包括重新计算以前可能已缓存的值,使用过多的malloc/free与使用内存池,
由于两个都是编译过的,所以编译程序现在是非常好的,如何处理C++,我认为唯一的问题来自于代码的优化程度。我认为在C++中编写更慢的代码会更容易,但是这取决于你的模型适合哪个样式。
归根结底,如果在同一台计算机上进行测量,我怀疑是否会有任何真正的区别,假设两者都写得很好,使用的任何库,它们写得有多好。

只要您不使用任何虚拟函数等。您不会注意到任何显著的性能差异。早期的C++被编译成C,所以只要你知道这些点产生了相当大的开销(比如用虚拟函数),你就可以清楚地计算出差异。 此外,我想指出,如果使用STL和Boost库,使用C++可以获得很多好处。特别是STL为最重要的数据结构和算法提供了非常高效且经验证的实现,因此您可以节省大量的开发时间


实际上,这还取决于您将使用的编译器以及它将如何优化代码

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

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

与文件输入和算法本身相比,函数调用与成员函数调用开销不太可能是限制因素。C++ iOFFROW不一定是超高速。C++有“限制”,如果你真的优化,在C++中更容易内联函数调用。总的来说,C++提供了更多的组织代码的选项,但是如果不是一个大程序,或者你只是用C或C++的方式来编写它,那么C库的可移植性就变得更重要了。

< P>不,除非你使用虚拟函数。 编辑:如果您需要运行时动态性,那么是的,虚拟函数与手动构造的
If-else
语句一样快或更快。但是,如果您在方法前面插入
virtual
关键字,但实际上并不需要多态性,那么您将支付不必要的开销。编译器不会在编译时对其进行优化。我只是指出这一点,因为它是C++的一个特性,它打破了“零开销原则”(引用Stroustrup)。 作为旁注,由于您提到大量使用fp数学:

下面的GCC标志可以帮助您加快速度(我确信Visual C++有相同的,但我不使用它):<代码> -MFPMODIS= SSE ,<代码> FFAST数学< /代码>和<代码> -MReRIP<<代码>(最后两个是“稍微危险的”,意思是它们可以在边缘情况下给你奇怪的结果来交换速度。第一个可以降低精度一点-你有64位双倍而不是80位的,但是这个额外的精度通常是不需要的。)这些标志对于C和C++编译器同样适用。


  • 根据处理器的不同,您可能还会发现,使用较大但非无穷大的值模拟true
    INFINITY
    可以很好地提高速度。这是因为true
    INFINITY
    必须由处理器作为特例处理。

    我认为,
    解算器
    类将构造一次,然后un方法执行一次…在这种环境中,您不会看到任何差异。相反,以下是需要注意的事项:

    • 内存管理非常昂贵。如果你需要做很多小的
      malloc()
      s,操作系统会吃掉你的午餐。如果你知道你很快会再次做同样的事情,那么一定要下定决心重新使用你创建的任何数据结构

    • 实例化类通常意味着…分配内存!同样,实例化少量对象并重新使用它们几乎没有成本。但要注意,创建对象只是为了很快将它们拆下并重建它们

    • 在问题允许的情况下,为您的体系结构选择合适的浮点类型。
      double
      可能会比
      float
      更快,尽管它需要更多内存。您应该尝试对此进行微调。理想情况下,您将使用
      #define
      typedef
      来指定e类型,以便您可以在一个位置轻松更改它

    • <> >整数计算可能比浮点快。根据数据的数值范围,也可以考虑用固定点小数处理整数。如果需要小数位数为3位,则可以使用<代码> int <代码> s和Co。