zoukankan      html  css  js  c++  java
  • 硬盘写入和内存写入到底有多大的差距

      分别以1倍size,10倍size,100倍size写入同样大小的数据,分别测试大文件写入和内存拷贝。

    tfwrite woaoniyoujifen,yueliangdaibiaowodexin!
    small write 100w times begin ...
    begin sec[1433735551], microsec[956743]
    small write 100w time over.
    end sec[1433735553], microsec[550436]
    Large write 10w times begin ...
    begin sec[1433735553], microsec[550470]
    Large write 10w times end.
    end sec[1433735553], microsec[719068]
    SuperLarge write 1w times begin ...
    begin sec[1433735553], microsec[719078]
    SuperLarge write 1w times end.
    end sec[1433735553], microsec[782787]




    begin to 100w small strcpy
    begin sec[1433735553], microsec[801839]
    100w small strcpy over .
    end sec[1433735553], microsec[879082]
    begin to 10w large strcpy
    begin sec[1433735553], microsec[885847]
    10w Large strcpy over .
    end sec[1433735553], microsec[930263]
    begin to 1w Superlarge strcpy
    begin sec[1433735553], microsec[936975]
    1w SuperLarge strcpy over .
    end sec[1433735553], microsec[978766]

    从测试结果看出,在大文件写入上内存和硬盘的差距只有1倍。应该是硬盘和内存的IO效率差别并不是太大,文件写入和内存写入真正拉开的是随机小文件的读写上,硬盘需要寻道,内存地址直接访问。  至于1倍size的文件写入和10倍size文件写入有8倍差距,可能是和频繁的内核切换有关。

     上面一组memcpy而不是strcpy+strlen的内存处理方式做一下数据,测试和上面一样。

            i = 0;
            offset = 0;
            size = strlen(szSuperLarge);
            while(i++ < 10000)
            {
                    memcpy(szSuperLargeBuff+offset, szSuperLarge, size);
                    offset += size;
                    //strcpy(szSuperLargeBuff+offset, szSuperLarge);
                    //offset += strlen(szSuperLarge);
            }
    begin to 100w small strcpy
    begin sec[1433743026], microsec[935164]
    100w small strcpy over .
    end sec[1433743026], microsec[991945]
    begin to 10w large strcpy
    begin sec[1433743026], microsec[998639]
    10w Large strcpy over .
    end sec[1433743027], microsec[18547]
    begin to 1w Superlarge strcpy
    begin sec[1433743027], microsec[25287]
    1w SuperLarge strcpy over .
    end sec[1433743027], microsec[33669]

     strcpy+strlen内存复制的三组时间,单位毫秒

    77243
    44416
    41791

    memcpy+size的三组时间,单位毫秒
    56781
    19908
    8382

    频繁小size内存memcpy比strcpy+strlen节约了不到1/3的时间,而大内存拷贝时竟节约了接近4/5的时间。

    结论:内存操作明显优于文件操作,而整块内存拷贝又明显优于字符拷贝。

     字符串拷贝优化的必要性

    以strcpy的方式

    单次拷贝38字节,拷贝100次,耗时7.7ms。

    单次拷贝3800字节,拷贝1次,耗时4.1ms。

     以memcpy的方式

    单次拷贝38字节,拷贝100次,耗时5.7ms。

     单次拷贝3800字节,拷贝1次,耗时0.8ms。

     高性能程序尽可能避免字符串重复拷贝,需要拷贝的时候大size字符串拷贝适合使用memcpy,小size字符串拷贝无明显讲究。

  • 相关阅读:
    WordPress使用记录
    Sql Server数据库的存储过程
    (一)vs2010 新建、使用dll
    Commons Betwixt : Turning beans into XML
    error: failed to attach to process ID 0
    java中常用的内存区域
    计算N阶乘中结尾有多少零
    计算出两个日期相隔多少天
    Cognos Active Report 时间区间选择的解决办法
    PHP heredoc 用法
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/4560598.html
Copyright © 2011-2022 走看看