zoukankan      html  css  js  c++  java
  • 直观比较读入的效率

    数据生成

    数据

    随机生成一个长度为 (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)
  • 相关阅读:
    好用的镜头站下载工具
    300+Jquery, CSS, MooTools 和 JS的导航菜单资源
    股票入门2
    MEF学习笔记(6):出口和元数据
    MEF学习笔记(5):迟延加载导出部件
    WinForm控件复杂数据绑定常用数据源(如:Dictionary)(对Combobox,DataGridView等控件DataSource赋值的多种方法)
    wpf 多线程绑定控件
    HTTP 错误 404.2 Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
    ADODB.Stream 错误 '800a0bbc' 写入文件失败。
    'System.Windows.StaticResourceExtension' threw an exception
  • 原文地址:https://www.cnblogs.com/wlzhouzhuan/p/13308180.html
Copyright © 2011-2022 走看看