解析cout与printf、i++与++i之间的速度差别

cout与printf之间的速度差异

之前一直对cout与printf的速度不是很了解,只是听师兄说过cout比printf慢。而cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低。而具体慢多少我也不清楚,今天写了一个程序测试了一下:
#include <iostream>
#include <ctime>
#include <cstdio>
using namespace std;

class Timer {
  public:
    Timer();
    double elaspsed_timer();
    void reset();
  private:
    clock_t start_time;
};

Timer::Timer() {
  start_time=clock();
}
double Timer::elaspsed_timer() {
  clock_t end_time=clock();
  return ((double)(end_time-start_time))/((double) CLK_TCK);
}
void Timer::reset() {
  start_time=clock();
}
int main() {
  long i;
  long end=100000;
  Timer t;
  double t1,t2;
  for(i=0;i<end;i++) cout<<i;
  t1 = t.elaspsed_timer();
  t.reset();
  for(i=0;i<end;i++) printf("%i",i);
  t2 = t.elaspsed_timer();

  cout<<endl<<"cout:"<<t1<<endl<<"printf:"<<t2<<endl;
  return 0;
}
大家来看看跑这个程序的结果:

cout足足比printf慢了一倍, 决定C++标准streams(cin,cout,cerr...)是否与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,缺省情况是同步的,但由于同步会带来某些不必要的负担,因此该函数作用就是我们自己可以取消同步 std::ios::sync_with_stdio(false); 
我们来试试加入这句话后的区别:
   
#include <iostream>
#include <ctime>
#include <cstdio>
using namespace std;

class Timer {
  public:
    Timer();
    double elaspsed_timer();
    void reset();
  private:
    clock_t start_time;
};

Timer::Timer() {
  start_time=clock();
}
double Timer::elaspsed_timer() {
  clock_t end_time=clock();
  return ((double)(end_time-start_time))/((double) CLK_TCK);
}
void Timer::reset() {
  start_time=clock();
}
int main() {
  ios_base::sync_with_stdio(false);  //加入这句话
  long i;
  long end=100000;
  Timer t;
  double t1,t2;
  for(i=0;i<end;i++) cout<<i;
  t1 = t.elaspsed_timer();
  t.reset();
  for(i=0;i<end;i++) printf("%i",i);
  t2 = t.elaspsed_timer();

  cout<<endl<<"cout:"<<t1<<endl<<"printf:"<<t2<<endl;
  return 0;
}


可见cout其实是要比printf快很多很多的(结果令人很吃惊)

i++与++i的速度差异

对上述代码加以修改
#include <iostream>
#include <ctime>
#include <cstdio>
using namespace std;

class Timer {
  public:
    Timer();
    double elaspsed_timer();
    void reset();
  private:
    clock_t start_time;
};

Timer::Timer() {
  start_time=clock();
}
double Timer::elaspsed_timer() {
  clock_t end_time=clock();
  return ((double)(end_time-start_time))/((double) CLK_TCK);
}
void Timer::reset() {
  start_time=clock();
}
int main() {
  //ios_base::sync_with_stdio(false);
  long i;
  long end=100000;
  Timer t;
  double t1,t2;
  for(i=0;i<end;i++) printf("%i",i);
  t1 = t.elaspsed_timer();
  t.reset();
  for(i=0;i<end;++i) printf("%i",i);
  t2 = t.elaspsed_timer();

  cout<<endl<<"i++:"<<t1<<endl<<"++i:"<<t2<<endl;
  return 0;
}



几乎没什么差别,所以各位就不要纠结到底用i++还是++i了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值