测试主机是AIX6.1
测试数据是向文件中顺序写入 8K * 50000 大小的数据,生成的文件大约为390M
测试对比了两种写操作,一种是aio_write, 另一种是 pwrite64; dwFlags 是open文件时,传入的参数
第一种测试
dwFlags = O_RDWR | O_LARGEFILE | O_DIRECT | O_CREAT | O_EXCL;
pwrite64 时间 : 237 秒
aio_write 时间: 236 秒
第二种测试
dwFlags = O_RDWR | O_LARGEFILE | O_SYNC | O_CREAT | O_EXCL;
pwrite64 时间 : 560秒
aio_write 时间: 567秒
第三种测试
dwFlags = O_RDWR | O_LARGEFILE | O_DIRECT | O_SYNC | O_CREAT | O_EXCL;
pwrite64 时间 : 568秒
aio_write 时间: 569秒
由于测试只是测试写操作,而且是顺序写,没有随机写;另一方面,没有在写操作中,加入写读作;还有就是只是对单一文件的写操作,不是多线程同时对多个文件的操作,所以测试还有很多局限性,更详细的测试需要进一步完成,还需测试不同页面大小时对性能的影响
从上面这三种测试来看,
第一,当 dwFlags 相同时, 在单文件上面,同步写(pwrite64 )和异步写(aio_write )差距不大,主要原因估计是glibc的底层实现也是通过pwrite64 实现的,只不过加了一个多线程,也许对多个文件时,会有一些差别。
第二,O_DIRECT 比 O_SYNC 比较大的提高写性能,快了一半,
第三,O_SYNC 与 O_DIRECT | O_SYNC 几乎相同,
下面是测试用的程序
#include <stdio.h> typedef char _aligned_char __attribute__ ((aligned (8192))); |