c++ - 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解决方案代码中提到的代码的执行时间没有显着差异。
解决方案
正如@Blastfurnace 在另一个问题中提到的那样。原因是在这里我比较了一个空循环和一个打印一些东西的循环。没有工作与一些工作。我之前的代码比较了一个做大量工作的循环和一个做同样工作但添加一个打印语句的循环。我在其他代码中的运行时间主要是计算,而不是单个附加打印。
推荐阅读
- excel - 试图在网页上找到一个单词的实例,但我试图抓取数据的尝试在第一关就失败了
- arrays - 在 Fortran 中求解线性方程组时获取错误值
- sql-server - SQL Server:具有透视数据的父子
- python - 如何在 Django 测试环境中模拟 googleapiclient
- c++ - 如何确保可以将 C++ 函数调用为
- sql - MERGE 语句产生多个“无效的列名”
- python - 如何使用 pandas 或等效的 python 库来解析 csv 文件
- arrays - 如何在 mongodb 中使用 ObjectId 更新对象数组中的字符串数组?
- css - 如何使 Bootstrap 列右对齐?
- unity3d - Unity2D:当相机视图的末端位于 x=0 或 y=0 时,相机会导致奇怪的撕裂问题