- 论坛徽章:
- 0
|
回复 5# irp
谢谢回复。我看了你给的链接,里面讨论了异步文件读写方法。
做了实验,结果是690ms,70MByte,101MByte/sec,速度没有明显提高。- VirtualAlloc(NULL, SIZE_70M, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
- ...
- CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED, NULL);
- ...
- WriteFile(hFile, p, SIZE_70M, &nwritten, &overlap);
复制代码 我不明白为什么要issues多个异步写。
1. 在应用程序里我用一块连续内存做图像缓冲区,在写入之前已经全部准备好了。
2. 我可以分出一个CPU Core单独用于文件写入。即,不需要利用磁盘写入的空闲时间来完成其他任务。
如果使用异步写,我可以想到的理由是把要写的内存分成几块,比如2块。一半儿一半儿。
然后用2个异步写同时写入两块数据到文件里,第二块儿的文件Offset用overlap.Offset指定。测试结果也是没有明显的速度提升。
另外我发现,在用_write()写入的时候用TaskManager看CPU,有一个Core的CPU利用率非常高,但是用WriteFile的时候,没有这种现象。
_write()的速度大概在400ms一下。
fwrite和_write是CRT(C RunTime)函数,最后都要用Windows API的WriteFile来写入文件。
不明白在大块数据无缓冲区写入的情况下,为什么_write会比WriteFile还快。 |
|