天天看点

C++输入、输出优化

相信有人遇到这样的情况:

bool isPalindrome(int x) {
    if (x < 0) return false;
    int reverse = 0, temp = x;
    while (x)
    {
        reverse = reverse * 10 + x % 10;
        x /= 10;
    }
    return reverse == temp ? true : false;
}           

在leetcode题目中,利用平台的执行用时可以看出程序的运行时间。以上的用时为204ms。

C++输入、输出优化

之后加入了std::ios::sync_with_stdio(false),其他不变就瞬间将执行时间提升到了56ms。

C++输入、输出优化

出于好奇心的驱使下,进行了搜索探究,以下是根据相关资料整理的个人对此的理解,可能存在有些不足,希望大家多指点。

cin vs scanf AND cout vs printf

scanf是格式化输入,printf是格式化输出。

cin是输入流,cout是输出流。

亲测发现cin,cout比scanf、printf的效率要低很多,那为什么C++iostream会存在cin\cout流操作呢?俗话说存在即合理。cin、cout牺牲了部分效率达到了书写简单方便的效果。

继续追寻为什么效率有差别,原因如下:

C++输入、输出优化

根据官方文档以及相关资料可以看出,C++中cin和标准输出流cout绑定在一起的,同时为了和stdio保持同步(这样大家可以混用两种方法,不至于文件指针乱码导致发生错误),因此cin牺牲掉一点效率,并且从文档中看到cout在输出时总是要先将输出的存入缓存区。而printf直接调用系统进行IO,它是非缓存的。所以cout比printf慢。

优化方法

  1. 最简单的方法就是尽量用stdio格式化输出输入来读取输出数据。
  2. 如果使用cin、cout可以使用std::ios::sync_with_stdio(false)来解除iostream和stdio的同步,让cin不超时,另外cout的时候尽量少用endl,换用”\n”,也是防止超时的方法。同时可以用cin.tie(NULL)来解除cin与cout的绑定。
  3. 最后,在进行大数据的I/O操作时,使用getchar()以及putchar(),众所周知, ch=getchar(); 在读入字符方面比 scanf(“%c”,&ch); 快得多。同理,putchar(); 在读入字符方面比 printf(); 快得多。所以,我们完全可以利用 getchar(),putchar(); 来加快文件读写速度。

继续阅读