C++快速文件IO效率测试



  • code

    #include <cstdio>
    #include <cctype>
    char buff[65536], *HEAD = buff, *TAIL = buff;
    #define getc() (HEAD == TAIL && (TAIL = (HEAD = buff) + fread(buff, 1, 65536, stdin), HEAD == TAIL) ? 0 : *HEAD++)
    char obuf[65536], *OHEAD = obuf, *OTAIL = obuf + 65536;
    #define putc(x) (OHEAD == OTAIL && (OHEAD = obuf, fwrite(obuf, 1, 65536, stdout)), *OHEAD++ = x)
    #define endo() (fwrite(obuf, 1, OHEAD - obuf, stdout))
    
    template <class T>
    bool read(T &ret)
    {
        char ch;
        bool flag = false;
        for (ch = getc(); !isdigit(ch); ch = getc())
            if (ch == 0)
                return false;
            else if (ch == '-')
                flag = true;
        for (ret = ch ^ 48; isdigit(ch = getc()); ret = (ret << 3) + (ret << 1) + (ch ^ 48))
            ;
        if (flag)
            ret = -ret;
        return true;
    }
    
    template <class T>
    T get()
    {
        T ret;
        char ch;
        for (ch = getc(); !isdigit(ch); ch = getc())
            ;
        for (ret = ch ^ 48; isdigit(ch = getc()); ret = (ret << 3) + (ret << 1) + (ch ^ 48))
            ;
        return ret;
    }
    
    template <class T>
    void fget(T &ret)
    {
        char ch;
        for (ch = getc(); ch < 48; ch = getc())
            ;
        for (ret = ch ^ 48; ch = getc(), ch > 47; ret = (ret << 3) + (ret << 1) + (ch ^ 48))
            ;
    }
    
    template <class T>
    void write(T x, char end = ' ')
    {
        static int osta[32];
        if (x == 0)
            putc('0');
        else
        {
            int top = 0;
            if (x < 0)
                putc('-'), x = -x;
            for (; x; x /= 10)
                osta[++top] = x % 10;
            for (; top;)
                putc(osta[top--] ^ 48);
        }
    	putc(end);
    }
    
    

    测试输出 (1亿数据)

    #include <ctime>
    #include <cassert>
    void testwrite(int num)
    {
        freopen("input.txt", "wb", stdout);
        for (int i = 0; i < num; ++i)
            write(i);
        endo();
    }
    int main()
    {
        double t=clock();
        testwrite(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出

    5.075s
    

    测试输入1 (1亿数据)

    #include <ctime>
    #include <cassert>
    void testread(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		assert(read(n));
    		assert(n==i);
        }
    }
    int main()
    {
        double t=clock();
        testread(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出

    3.199s
    

    测试输入2 (1亿数据)

    void testget(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		n=get<int>();
    		assert(n==i);
        }
    }
    
    int main()
    {
        double t=clock();
        testget(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出

    2.829s
    

    测试输入3 (1亿数据)

    void testfget(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		fget(n);
    		assert(n==i);
        }
    }
    
    int main()
    {
        double t=clock();
        testfget(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出(woc,竟然比2慢)

    2.947s
    

    测试输入4 (根据3,修改get,1亿数据)

    template <class T>
    T get()
    {
        T ret;
        char ch;
        for (ch = getc(); ch<48; ch = getc())
            ;
        for (ret = ch ^ 48; ch = getc(),ch>47; ret = (ret << 3) + (ret << 1) + (ch ^ 48))
            ;
        return ret;
    }
    void testget(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		n=get<int>();
    		assert(n==i);
        }
    }
    
    int main()
    {
        double t=clock();
        testget(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出

    2.541s
    

    缓慢的scanf(1亿数据)

    void testscanf(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		scanf("%d",&n);
    		assert(n==i);
        }
    }
    
    int main()
    {
        double t=clock();
        testscanf(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出

    145.710s
    

    最后测试cin(1亿数据)

    #include<iostream>
    using namespace std;
    void testcin(int num)
    {
        freopen("input.txt", "rb", stdin);
        int n;
        for (int i = 0; i < num; ++i)
        {
    		cin>>n;
    		assert(n==i);
        }
    }
    
    int main()
    {
        double t=clock();
        testcin(100000000);
        fprintf(stderr,"%.3lfs",(clock()-t)/CLOCKS_PER_SEC);
        return 0;
    }
    

    输出(考验耐心,巨慢)还是关闭与scanf的同步吧

    323.904s
    

 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待