4

我正在使用 VB6 和 Win32 API 将数据写入文件,此功能用于导出数据,因此写入磁盘的性能是我考虑的关键因素。因此,我在通过调用打开文件时使用FILE_FLAG_NO_BUFFERING和选项。FILE_FLAG_WRITE_THROUGHCreateFile

FILE_FLAG_NO_BUFFERING要求我使用自己的缓冲区并将数据以磁盘扇区大小的倍数写入文件,这通常没有问题,除了数据的最后一部分,如果它不是扇区大小的精确倍数将包括字符零填充文件,一旦写入最后一个块以不包含这些字符零,如何设置文件大小?

我可以使用SetEndOfFile,但这需要我关闭文件并重新打开它而不使用FILE_FLAG_NO_BUFFERING. 我见过有人谈论NtSetInformationFile但是我找不到如何在 VB6 中使用和声明它。SetFileInformationByHandle可以做我想要的,但是它只在 Windows Vista 中可用,我的应用程序需要与以前版本的 Windows 兼容。

4

3 回答 3

4

我相信 SetEndOfFile 是唯一的方法。

我同意 Mike G. 的观点,即您应该在有和没有 FILE_FLAG_NO_BUFFERING 的情况下对代码进行基准测试。现代操作系统上的 Windows 文件缓冲非常有效。

于 2008-09-29T09:57:24.980 回答
2

我不确定,但您确定该设置FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH为您提供最佳性能吗?

它们肯定会导致您的数据尽快进入磁盘,但这种事情实际上并不能帮助提高性能 - 它只会帮助您希望在发生以下情况时尽可能完整的日志文件的可靠性崩溃。

对于您描述的数据导出例程,允许操作系统缓冲您的数据可能会导致更好的性能,因为写入将根据其他磁盘活动安排,而不是强制磁盘每次写入都跳回您的文件.

如果没有这些选项,您为什么不对代码进行基准测试?保留零字节填充逻辑以使其成为公平测试。

如果事实证明跳过这些选项更快,那么您可以删除 0 填充逻辑,并且您的文件大小问题会自行修复。

于 2008-09-29T09:39:18.970 回答
0

对于 1 GB 的文件,Windows 缓冲确实可能会更快,尤其是在执行许多小型 I/O 时。如果您正在处理比可用 RAM 大得多的文件,并且进行大块 I/O,那么您设置的标志将产生更好的吞吐量(对于重线程和/或随机大块,速度提高三倍输入/输出)。

于 2011-06-15T17:00:09.803 回答