C++代码比其C等效代码慢吗?

16 浏览
0 Comments

C++代码比其C等效代码慢吗?

在C++编程语言中,是否有任何方面的代码比等效的C语言代码慢的情况?显然,这将排除掉像虚函数和虚函数表等面向对象的特性。

我想知道的是,在编写延迟至关重要的领域的代码时(并且不担心面向对象的特性),是选择基本的C++还是C更好?

0
0 Comments

C++ code which is slower than its C equivalent?

有人说C++的stdio.h与C++的iostream相比,前者的操作一般会更快(在某些情况下要快得多)。但是,如果你说的是以C语言的子集编写的C++代码,那么生成的机器代码很可能是相同的。至于printf()与cout<<的比较,在高优化级别下通常相反,这是由于运行时与编译时对格式字符串的评估。

不过,根据我的经验,printf明显比cout更快。要考虑的因素有:1)解析格式字符串的CPU成本几乎可以忽略不计,甚至相对于内存带宽和I/O带宽都是如此。2)对iostream的优化是一项非常复杂的任务,因为它严重依赖于对缓冲区对象的虚拟成员函数(例如basic_streambuf::xsputn)的细粒度委托以及facet的使用。

不过,要注意的是,这些“基准测试”并没有提到std::ios_base::sync_with_stdio(false)。当一个流在每一步都需要与stdio交互时,它显然会遇到一些困难。

当我使用std::cout.rdbuf()->pubsetbuf(new char[8192], 8192)时,cout和printf之间的差异要小得多(即使调用std::setvbuf(stdout, NULL, _IOFBF, 8192)来稍微平衡一下与stdio的差距)。实际上,当输出文本时,一旦缓存中有内容,cout的速度只是稍微快一点(374 vs 375 ms)。输出整数仍然稍微慢一些,但差距并不大(499 vs 468 ms)。

实际上,sync_with_stdio似乎并没有像缓冲区那样有那么大的差别。一个16字节的缓冲区(在VS 2010中)会显著增加cout的性能,而相同大小的缓冲区对于stdio却会使其变慢(以至于cout始终更快,甚至在输出整数时也是如此)。似乎stdio的最大优势在于它默认具有一个不错大小的缓冲区。

以上都是很好的观点,但你的结论似乎与我的回答基本一致——对于除了裸字符串以外的任何更有趣的东西,printf都更快,即使在调优后也是如此。我还注意到在VC++中,sync_with_stdio似乎是一个无操作。它设置了一个私有的静态成员变量(_Sync),但似乎没有用于任何操作。

是的...printf的整体速度似乎稍微快一点。只是如果使用正确的方式,它不会“始终和明显地”更快。差异与我们对这两种语言的性能的预期相符。

同意。我应该明确表示我不太看重微基准测试。它们只是提供了一个有趣的数据点,并对mic_e关于“通常相反”的建议提供了一个反例。

0
0 Comments

C++代码比其C等效代码慢的原因主要有两个:首先,C++缺乏关键字restrict,而C语言中有这个关键字。在某些情况下,使用restrict可以使编译器生成更快的代码。其次,C++对异常处理的支持也可能会带来性能上的开销。

关于restrict关键字,虽然在实际中很少能看到它的好处,但有很多时候C++或C编译器可以在内联之后推断出restrict的必要条件,并相应地进行优化,即使没有使用该关键字。而那些同时是C编译器和C++编译器的C++编译器,可能会作为扩展提供restrict__restrict关键字。

关于异常处理的开销,尽管C++实现了较低的开销,但仍然存在一定的开销。尤其是对于延迟敏感的代码,异常处理的开销可能会对性能产生影响。

解决这些问题的方法有:

- 对于restrict关键字的缺失,可以尝试使用一些编译器扩展来实现类似的优化。

- 对于异常处理的开销,可以尽量避免使用会引发异常的类型,或者在编译时禁用异常处理(如使用g++ -fno-exceptions编译选项)。

需要注意的是,对于这些问题是否会对代码性能产生实质性的影响,以及是否值得根据这些问题来选择编程语言,需要根据具体情况来衡量。在C++和C之间进行互操作是非常容易的,所以如果有任何原因更喜欢C++的话,只有在分析器告诉你函数太慢时才会考虑切换到C。

最后,C++运行时本身也有启动开销,这与C运行时的启动开销不一定相同。尽管可以通过移除不需要的部分来减少启动开销,但这需要付出一定的努力,实现并不总是完全帮你做这些事情。因此,尽管C++原则上是不付费的,但实现这一原则是一个质量问题。

0
0 Comments

C和C++语言标准中没有规定任何构造的速度(C++确实规定了应用于容器的某些操作的时间复杂度,但这超出了你的问题的范围)。生成给定构造的代码的速度取决于用于编译它的编译器和运行它的系统。

对于一个对于C和具有相同语义的有效的C++代码构造,没有任何"根本"的原因表明其中一个应该比另一个更快。但是,如果编译器的开发人员更聪明一些,很可能其中一个会比另一个更快。

谢谢,我明白了-我想我在提问时应该将编译器与语言捆绑在一起,因为语言只是生成汇编代码的一种方式。

“语言只是生成汇编代码的一种方式”-我不会这样说。高级语言(如C或C++)中的程序指定了行为。汇编代码只是产生所需行为的工具,而不是目的本身。

即使C++和C之间在语言标准中没有明确的性能差异,但是有些情况下C++代码可能比C代码慢。这可能是由于以下原因:

1. 编译器优化:不同的编译器可能对C和C++代码进行不同的优化。一些编译器可能更擅长优化C代码,而另一些则更擅长优化C++代码。这可能导致C++代码的性能相对较差。

2. 额外的语言特性:C++相对于C具有更多的特性和功能。这些额外的特性可能会导致C++代码在某些情况下比C代码更慢。例如,C++的异常处理机制可能会在性能上产生一些开销。

为了解决C++代码比C代码慢的问题,可以考虑以下解决方法:

1. 使用更好的编译器:尝试使用经过优化的编译器来编译C++代码。不同的编译器可能具有不同的优化策略,选择性能更好的编译器可能会改善C++代码的性能。

2. 优化代码:对C++代码进行优化,以减少不必要的开销和性能瓶颈。这包括避免过度使用C++的高级特性,使用更高效的算法和数据结构等。

3. 使用C语言的部分:在一些性能关键的部分,可以考虑使用C语言来编写代码,以获得更好的性能。这需要在C++代码和C代码之间进行适当的接口和交互。

总之,尽管C和C++在语言标准中没有明确的性能差异,但在实际应用中,C++代码可能比C代码慢。这可能是由于编译器优化和额外的语言特性等因素导致的。通过选择更好的编译器、优化代码和部分使用C语言等方法,可以改善C++代码的性能。

0