1
31
规则0:度量值。使用所有可用的分析工具并了解它们。这几乎是编程中的一条戒律,如果你不测量它,你就不知道它有多快,而对于I/O来说,这甚至更为真实。确保在 实际工作条件 如果可能的话。对于I/O系统没有竞争的过程,可以过度优化,针对实际负载下不存在的条件进行微调。
一些可能的考虑:
页面大小适合初学者,但要做好从中进行调整的准备。
不要以为它是最佳的。这取决于库在您的平台上得到了多彻底的锻炼,以及开发人员投入了多大的精力使它快速运行。说了一个便携式I/O库 可以 要非常快,因为大多数系统上都存在快速抽象,而且通常可以想出一个涵盖很多基础的通用API。据我所知,ASIO非常适合它所处的特定平台:有一整套操作系统和操作系统变种特定的API用于快速异步I/O(例如 epoll , /dev/epoll , kqueue , Windows overlapped I/O 阿西奥把它们都包起来了。
异步I/O在原始意义上并不比同步I/O快。异步I/O所做的是确保 你的 代码不会浪费等待I/O完成的时间。一般来说,它比另一种不浪费时间的方法(即使用线程)更快,因为它将在I/O准备好时(而不是在I/O之前)调用代码。不存在需要终止的空闲线程的错误启动或问题。 |
2
11
一个一般的建议是关闭缓冲和大容量读/写(但不要太大,这样您将浪费太多时间等待整个I/O完成,否则您就可以开始大嚼第一兆字节了。用这个算法找到最佳位置是很简单的,只有一个旋钮可以转动:块大小)。
除此之外,输入
对于输出,如果已经有一个缓冲区,请考虑使用一个文件(也可以使用
如果
(以上都是POSIX,Windows名称可能不同)。 |
3
6
对于Windows,如果您选择使用平台特定的Windows API调用,那么您需要确保在createfile()调用中使用文件_标志_顺序_扫描。这将优化I/O的缓存。就缓冲区大小而言,通常建议缓冲区大小是磁盘扇区大小的倍数。8K是一个很好的起点,从变大的过程中几乎得不到什么好处。 本文讨论了Windows上异步和同步的比较。 http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx |
4
3
如上所述,这完全取决于您使用的机器/系统/库。一个系统上的快速解决方案可能会比另一个系统慢。
|
5
2
你问过C++,但是听起来你已经过了,准备好了一个特定的平台。
在Windows上,
如果文件不在本地设备上,而是在网络驱动器上,则需要小心。网络错误将显示为SEH错误,您需要做好处理准备。 在*nixes上,您可能会得到一个更高的性能,按顺序写入原始磁盘设备。这在Windows上也是可能的,但API并不支持。这将避免一点文件系统开销,但可能不够有用。 不严格地说,RAM比磁盘快1000倍或更多,CPU也更快。除了尽可能避免移动磁盘头(SEEK),可能没有太多的逻辑优化可以帮助您。专门用于这个文件的磁盘在这里有很大的帮助。 |
6
2
通过使用
读取缓冲区大小为2的幂。只有基准测试才能确定这个数字。我见过一次是8公里。又一次我发现它是8米!这变化很大。 它取决于CPU缓存的大小、操作系统预读的效率以及与执行许多小的写入相关的开销。 内存映射是 不 最快的方法。它有更多的开销,因为您不能控制块的大小,并且操作系统需要在所有页面上出错。 |
7
2
在Linux上,缓冲的读写速度会大大提高,随着缓冲区大小的增加,速度也会越来越快,但回报却在减少,您通常希望使用
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |