文件截断操作是否影响缓存及后续文件写入性能?
截断文件后写入是否比直接写入更慢?
假设先向文件A写入一定数据,关闭后用open("A", O_TRUNC | O_WRONLY);重新打开文件,再写入同等数据。这种方式会比不执行截断的程序更慢吗?换句话说,截断操作是否会清除文件内容的缓存行,导致后续写入操作始终出现缓存未命中?
测试验证
按照测试方案,我编写了如下代码对比两种方式的性能差异:
// includes #define M 1024*128 // 128 KB int main(int argc, char *argv[]) { double start = get_seconds(); // 基于gettimeofday()实现 int out = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666); int k; char buf[M]; for(k=0; k<M; k++) { buf[k] = '0'; } write(out, buf, sizeof(buf)); close(out); printf("%f\n", get_seconds() - start); return 0; }
通过脚本连续执行该代码及不含O_TRUNC的相同版本各1000次,每次使用不同文件名,得到以下平均结果:
| 文件大小 | 不含O_TRUNC | 含O_TRUNC | 性能提升倍数 |
|---|---|---|---|
| 32 KB | 0.0000603 s | 0.0001182 s | 1.96X |
| 64 KB | 0.0001004 s | 0.0001759 s | 1.75X |
| 128 KB | 0.0001621 s | 0.0002640 s | 1.63X |
| 256 KB | 0.0002554 s | 0.0004336 s | 1.70X |
| 512 KB | 0.0004284 s | 0.0007537 s | 1.76X |
| 1024 KB | 0.0007371 s | 0.0011899 s | 1.61X |
结论
从测试结果可以明显看出,执行O_TRUNC截断后的写入操作比不截断的版本慢1.6~2倍左右,两种方式存在显著的性能差异。
内容的提问来源于stack exchange,提问作者Hanz Schmidt
相关产品推荐
相关产品推荐

