我想知道为什么会一直这样...... !! 我在c中编写了两个程序,在c ++中编写了另一个程序.两者都执行相同的操作.即打印1到2000000之间的数字.此外,我在执行开始时设置计时器..并且在打印之后还打印所有经过的时间.c ++程序所用的时间总是大于交流程序.我觉得时间差异很大.我很想知道这是什么原因.. ???? ..
这是两个程序
//iotest.c
#include<stdio.h>
#include<time.h>
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
printf("%d\n",i);
printf("Time Elapsed: %f\n",((double)clock()-start)/CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
//iotest.cpp
#include<iostream>
#include<time.h>
using namespace std;
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
cout<<i<<endl;
cout<<"Time elapsed "<<((double)clock()-start)/CLOCKS_PER_SEC<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
// ver C++ 4.3.2通过发出命令编译c程序
g ++ iotest.c
执行给出
1
.
.
2000000
经过的时间:5.410000(并不总是相同..)
执行第二个程序
1
.
.
2000000
时间流逝:5.81(并非总是相同..)
Gab*_*abe 18
两个程序之间的区别在于C++版本使用endl,它不仅插入换行符而且刷新缓冲区.执行任何输出的缓慢部分是刷新缓冲区.
如果你使用C++程序,这两个程序的速度可能大致相同
count << i << "\n";
Run Code Online (Sandbox Code Playgroud)
以下两个程序实现了类似的执行时间:
C程序(a.c):
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start=clock();
for (int i=0; i<2000000; i++) printf("%d\n",i);
clock_t end=clock();
fprintf(stderr, "Time Elapsed: %f\n",((double)end-start)/CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译: gcc -O3 -std=c99 a.c
C++ - program(b.cpp):
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
clock_t start=clock();
for (int i=0;i<2000000;i++) cout << i << '\n';
clock_t end=clock();
cerr << "Time elapsed " << ((double)end-start)/CLOCKS_PER_SEC << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译 g++ -O3 b.cpp
您已经在静态初始化时启动了时钟,并且您的C++标准库在静态初始化期间可能还有更多工作要做.
你也在反复冲洗你的流,而且iostreams有点慢.
做这个:
#include <iostream>
#include <ctime>
int main()
{
std::clock_t start = std::clock();
for (int i=0;i<2000000;i++)
std::cout << i << '\n';
std::cout << "Time elapsed " << (static_cast<double>(std::clock()-start)/CLOCKS_PER_SEC) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一个适当的基准测试将涉及您多次运行该程序,然后取结果的平均值.你的结果并不可靠.
(还要注意我是如何改变time.h它的C++对应物的ctime.)
使用cout << endl会强制冲洗.如果你使用,可能差别会更小cout << "\n"
也就是说,iostream(在我个人看来)并不是最有效的机制,我希望printf仍然更快.如果输出速度是应用程序的性能瓶颈,你可能应该转到stdout,否则只需坚持使用类型安全的cout.
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |