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字符串拷贝无明显讲究。

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/4560598.html
Copyright © 2011-2022 走看看