首页 > 解决方案 > C++中程序执行中带cout和不带cout的时间差

问题描述

我在一个编程博客上读到,一个包含大量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

这是第二个片段。注意++num 之后的cout语句main()

#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解决方案代码中提到的代码的执行时间没有显着差异。

标签: c++boost

解决方案


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


推荐阅读