【问题标题】:Time difference with cout and without cout in C++ in program executionC++ 程序执行中带 cout 和不带 cout 的时间差
【发布时间】:2020-04-06 17:52:09
【问题描述】:

我在一个编程博客上读到,一个包含大量print 语句的程序需要更多时间来完成它的执行,因为它必须不断地将数据发送到输出缓冲区。我正在解决 ProjectEuler 问题 #12。我已经成功解决了。以下是代码

#include <iostream>
#include <ctime>
#include <boost/multiprecision/cpp_int.hpp>
using big_int = boost:: multiprecision:: cpp_int;
using namespace std;
clock_t start = clock();
big_int get_num(big_int num) {
    return num*(num + 1) / 2;
}

big_int num_of_factors(big_int num) {
    big_int count = 0;
    for(big_int i = 1; i <= sqrt(num); ++i) {
        if(num % i == 0) {
            if(num / i == i)
                count += 1;
            else
                count += 2;
        }
    }
    return count;
}
int main() {
    big_int num = 1;
    while(true) {
        if(num_of_factors(get_num(num)) >= 500) {
            cout << get_num(num);
            break;
        }
        ++num;
    }
    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
    return 0;
}

经过的时间: /home/arun/CLionProjects/DebugTutorial/cmake-build-debug/DebugTutorial 76576500 时间是 106.029 秒 进程以退出代码 0 结束

这是第二个sn-p。注意main()中的cout语句在++num

之后
#include <iostream>
#include <ctime>
#include <boost/multiprecision/cpp_int.hpp>
using big_int = boost:: multiprecision:: cpp_int;
using namespace std;
clock_t start = clock();
big_int get_num(big_int num) {
    return num*(num + 1) / 2;
}

big_int num_of_factors(big_int num) {
    big_int count = 0;
    for(big_int i = 1; i <= sqrt(num); ++i) {
        if(num % i == 0) {
            if(num / i == i)
                count += 1;
            else
                count += 2;
        }
    }
    return count;
}
int main() {
    big_int num = 1;
    while(true) {
        if(num_of_factors(get_num(num)) >= 500) {
            cout << get_num(num);
            break;
        }
        ++num;
        cout << get_num(num) << endl; //Notice this
    }
    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
    cout << endl << "Time is " << elapsedTime << " Seconds";
    return 0;
}

经过的时间: 时间是 110.946 秒 进程以退出代码 0 结束

我真正想知道的是为什么这两个代码的执行时间没有显着差异。而另一个版本中有print 语句。

例如, 看看这些代码:

1) 没有print 声明:

#include <iostream>
#include <ctime>
#include <boost/multiprecision/cpp_int.hpp>
using big_int = boost:: multiprecision:: cpp_int;
using namespace std;
clock_t start = clock();

int main() {
    for(big_int i = 0; i < 10000000; ++i) {
    }
    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
    cout << endl << "Time is " << elapsedTime << " Seconds";
    return 0;
}

执行时间:

时间为 0.370125 秒

2) 带有print 声明

#include <iostream>
#include <ctime>
#include <boost/multiprecision/cpp_int.hpp>
using big_int = boost:: multiprecision:: cpp_int;
using namespace std;
clock_t start = clock();


int main() {
    for(big_int i = 0; i < 10000000; ++i) {
         cout << i << endl;
    }
    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;
    cout << endl << "Time is " << elapsedTime << " Seconds";
    return 0;
}

执行时间:

时间是 26.8947 秒

我想知道像这两个代码为什么在ProjectEuler解决方案代码中提到的代码的执行时间没有显着差异。

【问题讨论】:

  • 您期待什么样的减速?双倍,三倍?都是相对的。您可能会遇到您认为的减速,但您的测量包括实际算法的工作原理。
  • 您的时间被num_of_factors 的调用所占据。在perf 下查看您的程序的痕迹,您会看到它。
  • 您还应该关闭与std::ios::sync_with_stdio(false) 的 printf 同步,因为这也是 cout 速度慢的原因之一。见why is cin/cout slower than scanf/ printf

标签: c++ boost


【解决方案1】:

正如@Blastfurnace 在另一个问题中提到的那样。 原因是在这里我比较了一个空循环和一个打印一些东西的循环。没有工作与一些工作。我之前的代码比较了一个做大量工作的循环和一个做同样工作但添加一个打印语句的循环。我在其他代码中的运行时间主要是计算,而不是单个附加打印。

【讨论】:

    【解决方案2】:

    每个代码示例的执行时间可能没有“显着差异”。但是,有区别。在示例中,差异是微不足道的。但是,如果在程序中更积极地调用 print 语句,则执行时间的差异将非常显着。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多