printf比std::cout快5倍以上?

10 浏览
0 Comments

printf比std::cout快5倍以上?

下面是前五次运行的时间:

  • std::cout测试:1.125 秒;printf测试:0.195
  • std::cout测试:1.154 秒;printf测试:0.230
  • std::cout测试:1.142 秒;printf测试:0.216
  • std::cout测试:1.322 秒;printf测试:0.221
  • std::cout测试:1.108 秒;printf测试:0.232

正如您所看到的,使用printf然后刷新(fflush)的时间大约比使用std::cout少5倍。虽然我预计使用std::cout的<<操作符可能会稍微慢一些(几乎是最小的),但我没有预料到会有这么大的差异。我是否进行了公平的测试?如果是这样的话,那么是什么导致第一个测试比第二个测试慢这么多,尽管它们本质上做了完全相同的事情?

0
0 Comments

printf比std::cout运行更快,这个问题的出现是因为std::cout缓冲机制的存在。当我们使用std::cout输出一段文字时,它并不会立即将内容显示在屏幕上,而是先存储在一个缓冲区中,等到达一定条件才会一次性将内容输出到屏幕上。这个缓冲区的存在导致了输出的延迟,从而使得std::cout的运行速度变慢。

解决这个问题的方法是使用cout << "\n";来手动刷新缓冲区。当我们在输出完一段文字后,添加一个换行符,就会触发缓冲区的刷新,使得内容立即显示在屏幕上。这样就能大大提高std::cout的运行速度,使其接近printf的效率。

总结起来,通过手动刷新缓冲区,可以解决std::cout运行速度较慢的问题,使其与printf的速度相近。

0
0 Comments

printf比std::cout快5倍的原因是std::cout在输出时会与stdout同步,而printf则不需要。当代码中使用了std::cout.sync_with_stdio(false)后,std::cout不再与stdout同步,因此输出速度更快。

解决方法就是在代码中添加std::cout.sync_with_stdio(false)来取消std::cout与stdout的同步。

通过测试发现,P1的时间(即使用std::cout输出的时间)在取消同步后有所提升,而P2的时间(即使用printf输出的时间)没有变化。这是因为取消同步后,代码不再尝试保持std::cout和stdout的同步,对于纯C++代码且只使用std::cout的情况下,这不是一个问题。

0
0 Comments

printf比std::cout快5倍以上,这个问题的出现原因是因为测试中只有打印函数发生了改变,其他部分都保持不变。为了得到准确的比较结果,需要重新编写测试代码,只改变打印函数的调用方式。修改后的代码如下:

int main(int argc, char* argv[])
{
    const char* teststring = "Test output string\n";
    std::clock_t start;
    double duration;
    std::cout << "Starting std::cout test." << std::endl;
    start = std::clock();
    for (int i = 0; i < 1000; i++)
        std::cout << teststring;
    /* Display timing results, code trimmed for brevity */
    for (int i = 0; i < 1000; i++) {
        std::printf(teststring);
        std::fflush(stdout);
    }
    /* Display timing results, code trimmed for brevity */
    return 0;
}

这样,我们只测试了printf和cout之间的区别。不会因为多个<<调用等产生任何差异。如果尝试这样修改代码,预计会得到完全不同的结果。

然而,现在只有0.06秒的差异。可能是因为printf部分在每次迭代后刷新了stdout,而std::cout部分没有。我们可以在std::cout部分添加<< std::flush()来解决这个问题。

另外,添加以下代码可以进一步改善性能:

std::cout.sync_with_stdio(false);

如果性能差异是由于将整数i格式化为字符串的原因,这个比较就没有意义。可能需要对比其他方面的性能差异。虽然我的测试结果显示多个<<运算符可能是主要原因,所以没有展示测试其他因素的示例代码。然而,如果整数转换是问题的原因,可以应用同样的原则(消除变量来简化问题)来解决问题。

如果差异是由于需要更多的<<调用而不是printf调用,那么这种比较是合适的。简化测试到你所做的这种程度是不现实的。

0