在MacOS X机器上运行以下C代码(对2GB文件进行一系列的mmaps和munmaps操作)似乎比Linux机器慢得多。
#define BUFSZ 2000000000
static u_char buf[BUFSZ];
....
// Time 10000 mmaps and munmaps from random offsets for various
// sizes of mapped chunk.
for (msize = 4096; msize <= 1048576; msize *= 16) {
fd = open("io_benchmark.dat", O_RDONLY);
if (fd < 0 ) die("can't open io_benchmark.dat for reading");
for (i = 0; i < 10000; i++) {
// Make sure the block to be mapped doesn't start in the
// last meg.
offset = (size_t) random() % (BUFSZ - 1048576);
mblock = femmap(fd, (off_t)offset, (size_t) msize, PROT_READ,
"test block");
total = 0;
for (j = 0; j < msize; j++) {
total += mblock[j];
}
femunmap(mblock, (size_t) msize, "test block");
}
printf("Elapsed time to mmap and munmap 10000 blocks of %d kB: %.4f sec\n",
msize/1024, (time = time_since_last_call()));
rslt = close(fd);
if (fd < 0 ) die("can't close io_benchmark.dat after reading");
}
具体来说,比较两台机器。
CPU Xeon E3113 dual core @ 3.00GHz Core 2 Duo @ 2.4GHz dual core
RAM 8GB 4GB
Kernel 2.6.18-92.el5PAE SMP i686 MacOS 10.6.4 Snow Leopard
Disk WD 250GB SATA 16MB cache 7200 RPM EXT3 Hitachi 250GB SATA 5400 RPM, journaled HFS+
提供以下结果。
Linux MacOS X
Time for 10000 4kB mmaps 0.0165 682.87
Time for 10000 64kB mmap 0.0170 657.79
Time for 10000 1MB mmaps 0.0217 633.38
即使考虑到内存减少的情况,由于文件仅占物理内存的一半,这似乎是不寻常的。有人能指出可能改善性能的代码变更或配置变更吗?
我们尝试使用读取而不是mmaps,确实会产生很大的差异,但这需要对现有代码库进行重大更改(并且在linux上mmap比读取快得多)。
total
变量在赋值后没有被使用?它可能会被优化掉,因此您可能没有测量到正确的内容。 - Jens Gustedtbuf
数组从未被使用 - 也许你需要展示一下femmap()
和femunmap()
函数的定义?一个可编译的示例总是有帮助的。 - caf