From: http://www.cppblog.com/whoami17/archive/2009/05/10/82452.html

今天突然想比较一下 write() 和 writev() 的性能, 网上google了半天, 竟然没有发现一点有关的数据信息, 自己就测试了一下。

平台如下:
CentOS 5.2 Linux kernel 2.6.18-92.e15
CPU: Intel(R) Pentium(R) 4 CPU 2.40GHz
Disk: 7200 rpm

测试的想法是: 对于writev(), 如果有10 个buffer, 并且buffer的大小是1kb,  那么我就先依次调用write() 10 次, 每次写1KB 到同一个文件, 记录下时间, 然后记录下用writev()的时间。 最后, 以write()为baseline, 计算writev()所占的%, 如果%越小, 证明writev() 的性能就越好。

做了两组测试,

第一组, 固定buffer 的个数(10, 100, 1000), 依次增加buffer的大小, 从1KB -- 1024KB, 数据如下, (基准线为相应write()的数据)

例如, 10 个buffer, 每个buffer size 是1KB。 write() 耗时0.092 ms, writev() 耗时0.098 ms, 图中的数据即为 1.067 (write_v10, 1KB)

图一

第二组, 固定buffer大小(1KB, 2KB, 8KB), 依次增加buffer的数目, 从 200 -- 8000, 数据如下 (基准线为相应write()的数据)

图二

第一组数据显示:1.  随着buffer的增大 ( > 64KB), writev()的性能开始跟write()持平; 2. 如果buffer的个数过小 , writev()的性能是低于write()的。 从图一可以看到,  在buffer size 小于1024KB 时, writev() 使用10 个buffer的性能要低于100 和1000。

第二组数据显示: 1. 当保持buffer size一定情况下, 增加buffer的个数 (< 2000), writev() 的性能稳定在70%左右; 2. 增加buffer size, 将会降低writev()的性能。 当buffer为8KB 时, writev() 所用时间基本上都为相应write()时间的80%, 性能的提高明显不如1KB 和 2KB。3. 当buffer的个数超过2000, 并且buffer size 大于2KB, writev()性能将远不如write()。

结论:
writev() 应使用在small write intensive 的workload中, buffer size 应控制在 2KB 以下, 同时buffer的数目不要超过IOV_MAX, 否则 writev() 并不会带来性能的提高。 
 
现在, 所要研究的问题是对于不同的workload, 如何快速的确定writev()中buffer的个数和大小, 从而达到较好performance。

write() vs. writev()相关推荐

  1. 报错解决: error: ‘writev’ was not declared in this scope

    下午在编译paxosstore时报错如下: -> # g++ -O0 -g2 -DCERTAIN_DEBUG=0 -std=c++11 -I./ -I./src/ -I./include/ -I ...

  2. readv和writev函数

    一.函数原型 #include <sys/uio.h>ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);ssi ...

  3. 网络编程学习笔记(readv和writev函数)

    这两个函数与read和write相似,但readv和writev可以让我们在一个函数调用中读取多个缓冲区,这些操作被称为分散读和集中写.其函数原型为: #include <sys/uio.h&g ...

  4. 简介I/O向量、sendv、writev

    在我们了解使用附属数据工作的复杂函数之前,我们应该熟悉被readv(2)与writev(2)系统调用所使用的I/O向量.我们不仅将会发现这些函数是十分有用的,而他们的工作方式也被引入了一些附属数据函数 ...

  5. 谈谈writev的问题

    转载地址:http://blog.lucode.net/linux/talk-about-the-problem-of-writev.html POSIX提供了一个比write函数更加高级的write ...

  6. 高级I/O(七)--readv和writev函数

    From: http://blog.chinaunix.net/uid-26822401-id-3158225.html readv和write函数让我们在单个函数调用里从多个不连续的缓冲里读入或写出 ...

  7. Unix系统编程():分散输入和集中输出(Scatter-Gather IO):readv和writev

    分散输入和集中输出(Scatter-Gather IO):readv和writev 请问这个v又代表什么? readv和writev系统调用分别实现了分散输入和集中输出的功能. #include< ...

  8. Linux的iovec、readv和writev

    iovec struct iovec {void *iov_base; /* Starting address */size_t iov_len; /* Number of bytes to tran ...

  9. writev遇到非阻塞IO

    这几天在处理一些协议上面的东西,还算简单吧,封装一些字段然后发出去. 问题就出现在了发出去这个地方,发的地方使用的是writev,writev可以发送多个分散的,不连续的内存里面的东西.比方说,我封装 ...

最新文章

  1. Activity 启动模式以及常见的启动Flag
  2. mds聚类matlab,MDS图示聚类结果
  3. Spring MVC搭建REST风格网站
  4. java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法
  5. 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序
  6. php与ipa接口登录验证失败,thinkPHP5.0开发微信小程序登录接口signature验证失败
  7. Etcd服务发现原理
  8. 1. Symfony 2 --- 简介
  9. c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版
  10. 面试题整理 | 45道CSS面试题
  11. 等保三级核心-物理安全
  12. 航飞影像的GPS坐标导出、修改、写入(EXIF信息)
  13. kubernetes配置kubeconfig访问集群
  14. 慕测平台的使用—— 在eclipse上安装mooctest插件
  15. 浩辰CAD 2019 v190128官方免费版
  16. 国内五大抗DDoS服务
  17. AM5728概述(1)
  18. 倍福TwinCAT3导入TwinCAT2项目的方法
  19. P3387 【模板】缩点 Tarjan强连通分量/树上dp
  20. Java健康档案管理系统

热门文章

  1. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
  2. leetcode 26. 删除有序数组中的重复项
  3. webpack 谷歌地图_如何在Webpack中设置可靠且可维护的Google Analytics(分析)
  4. 回复邮件时如何不要邮件头_如何为阅读,点击和回复率达到100%的CEO设计一封冷邮件...
  5. 双城记s001_双城记! (使用数据讲故事)
  6. r语言怎么以第二列绘制线图_用卫星图像绘制世界海岸线图-第二部分
  7. {0,1,2.....Fmax} 每个数出现的次数
  8. mysql 删掉重复数据
  9. cv1159 最大全0子矩阵(极大子矩阵)
  10. 如何拿到阿里算法校招offer