直观比较读入的效率

数据生成

数据

随机生成一个长度为 (5 imes 10^7) ,值域在 ([0,500)) 的数列。

数据生成器

int main() {
  srand(time(NULL));
  freopen("1.in", "w", stdout);
  for (int i = 1; i <= 50000000; i++) {
    printf("%d ", rand() % 500);
  }
}

对比

以下所有测试均在 -std=c++11,-O2,-O3 下进行。

cin

const int N = 50000005;
int a[N], n = 50000000;
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
}

cin 关同步流

const int N = 50000005;
int a[N], n = 50000000;
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
}

scanf

const int N = 50000005;
int a[N], n = 50000000;
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
}

快读

const int N = 50000005;
int a[N], n = 50000000;
int read() {
  int x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while ('0' <= ch && ch <= '9') x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); 
  return x;
}
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

快读 + isdigit

const int N = 50000005;
int a[N], n = 50000000;
int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); 
  return x;
}
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

inline + 快读 + isdigit

const int N = 50000005;
int a[N], n = 50000000;
inline int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); 
  return x;
}
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

fread

const int N = 50000005;
int a[N], n = 50000000;
char buf[1 << 21], *p1 = buf, *p2 = buf;
int getc() {
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF: *p1++;
}
int read() {
  int x = 0;
  char ch = getc();
  while (!isdigit(ch)) ch = getc();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getc();
  return x;
}
int main() {
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

sgetn

const int N = 50000005;
int a[N], n = 50000000;

const int B = 1 << 21;
char Obuf[B], Ibuf[B];
char *optr = Obuf, *ist = 0, *ied = 0;
streambuf *out, *in;
void print(char c) {
  optr == Obuf + B ? (out->sputn(Obuf, B), optr = Obuf), *optr++ = c : *optr++ = c;
}
void flush() {
  out->sputn(Obuf, optr - Obuf);
}
char getc() {
  return ist == ied ? ied = Ibuf + in->sgetn(ist = Ibuf, B), (ist == ied ? -1 : *ist++) : *ist++;
}
int read() {
  int x = 0;
  char ch = getc();
  while (!isdigit(ch)) ch = getc();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getc();
  return x;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  in = cin.rdbuf(), out = cout.rdbuf();
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

mmap

#include <bits/stdc++.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
using namespace std;

const int N = 50000005;
int a[N], n = 50000000;

char *pc;
int read() {
  int x = 0;
  char ch = *pc++;
  while (!isdigit(ch)) ch = *pc++;
  while (isdigit(ch)) x = (x << 3) + (x << 1) + ch - '0', ch = *pc++;
  return x;
}

int main() {
  pc = (char *) mmap(NULL, lseek(0, 0, SEEK_END), PROT_READ, MAP_PRIVATE, 0, 0);
  freopen("1.in", "r", stdin);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
  }
}

对比表

读入方式 实验1/s 实验2/s 实验3/s 平均用时/s 效率排名
( exttt{cin}) (23.890s) (23.990s) (23.820s) (23.900s) (9)
( exttt{scanf}) (20.490s) (20.310s) (20.350s) (20.383s) (8)
( exttt{cin}) 关同步流 (5.936s) (5.970s) (5.862s) (5.923s) (7)
快读 (4.601s) (4.670s) (4.666s) (4.646s) (6)
快读 + ( exttt{isdigit}) + ( exttt{inline}) (4.626s) (4.616s) (4.589s) (4.610s) (5)
快读 + ( exttt{isdigit}) (4.627s) (4.569s) (4.611s) (4.602s) (4)
( exttt{fread}) (0.546s) (0.558s) (0.547s) (0.550s) (3)
( exttt{sgetn}) (0.535s) (0.542s) (0.541s) (0.539s) (2)
( exttt{mmap}) [N/A] [N/A] [N/A] [N/A] 理论 (1)
原文地址:https://www.cnblogs.com/wlzhouzhuan/p/13308180.html