数据生成
数据
随机生成一个长度为 (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) |