请考虑以下程序:
#define _FILE_OFFSET_BITS 64 // Allow large files.
#define REVISION "POSIX Revision #9"
#include <iostream>
#include <cstdio>
#include <ctime>
const int block_size = 1024 * 1024;
const char block[block_size] = {};
int main()
{
std::cout << REVISION << std::endl;
std::time_t t0 = time(NULL);
std::cout << "Open: 'BigFile.bin'" << std::endl;
FILE * file;
file = fopen("BigFile.bin", "wb");
if (file != NULL)
{
std::cout << "Opened. Writing..." << std::endl;
for (int n=0; n<4096; n++)
{
size_t written = fwrite(block, 1, block_size, file);
if (written != block_size)
{
std::cout << "Write error." << std::endl;
return 1;
}
}
fclose(file);
std::cout << "Success." << std::endl;
time_t t1 = time(NULL);
if (t0 == ((time_t)-1) || t1 == ((time_t)-1))
{
std::cout << "Clock error." << std::endl;
return 2;
}
double ticks = (double)(t1 - t0);
std::cout << "Seconds: " << ticks << std::endl;
file = fopen("BigFile.log", "w");
fprintf(file, REVISION);
fprintf(file, " Seconds: %f\n", ticks);
fclose(file);
return 0;
}
std::cout << "Something went wrong." << std::endl;
return 1;
}
这段代码的作用是将4GB的零填充写入磁盘文件,并计算所需时间。
在Linux下,平均需要148秒。在同一台PC上运行Windows,则平均需要247秒。
我到底做错了什么?!
这段代码在Linux编译器GCC和Windows编译器Visual Studio下编译,但我无法想象编译器对纯I/O基准测试会有任何可测量的影响。在所有情况下使用的文件系统都是NTFS。
我只是不明白为什么存在如此巨大的性能差异。我不知道为什么Windows运行得如此缓慢。我应该如何强制Windows以显然可行的最大速度运行?
(上述数字是基于旧的Dell笔记本电脑上的OpenSUSE 13.1 32位和Windows XP 32位。但我在办公室里的几台PC上观察到了类似的速度差异,运行不同版本的Windows。)
编辑:可执行文件和它所写的文件都驻留在格式为NTFS且几乎为空的外部USB硬盘上。碎片几乎肯定不是问题。可能是某种驱动程序问题,但我看到了在运行不同版本的Windows的其他几个系统上出现了相同的性能差异。没有安装任何杀毒软件。
只是为了好玩,我尝试直接使用Win32 API。(显然,这仅适用于Windows。)时间变得有些不稳定,但仍然在之前的几个百分点之内。除非我指定FILE_FLAG_WRITE_THROUGH
;否则它会变得明显更慢。一些其他标志使其变慢,但我找不到可以加速它的标志...
fwrite
仍然取决于编译器。 - PaulMcKenzie