下面是两个将 50,000,000 字节写入文件的程序。
第一个用 C 语言编写的程序使用一个缓冲区,一旦填充到任意值,就写入磁盘,然后重复该过程,直到写入所有 50,000,000 个字节。我注意到,当我增加缓冲区的大小时,程序运行的时间就会减少。例如,在 BUFFER_SIZE = 1 时,程序耗时约 88.0463 秒,而在 BUFFER_SIZE = 1024 时,程序仅耗时约 1.7773 秒。我记录的最佳时间是 BUFFER_SIZE = 131072。随着 BUFFER_SIZE 的增加,我注意到它实际上开始需要更长的时间。
第二个程序是用 C++ 编写的,它利用 ofstream 一次写入一个字节。令我惊讶的是,该程序只用了大约 1.87 秒即可运行。我预计它需要一分钟左右,就像 BUFFER_SIZE = 1 的 C 程序一样。显然,C++ ofstream 处理文件写入的方式与我想象的不同。根据我的数据,它的性能与 BUFFER_SIZE = 512 的 C 文件非常相似。它是否使用某种幕后缓冲区?
这是C程序:
const int NVALUES = 50000000; //#values written to the file
const char FILENAME[] = "/tmp/myfile";
const int BUFFER_SIZE = 8192; //# bytes to fill in buffer before writing
main()
{
int fd; //File descriptor associated with output file
int i;
char writeval = '\0';
char buffer[BUFFER_SIZE];
//Open file for writing and associate it with the file descriptor
//Create file if it does not exist; if it does exist truncate its size to 0
fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
for(i=0;i<NVALUES;i++)
{
//Package bytes into BUFFER_SIZE chunks
//and write a chunk once it is filled
buffer[i%BUFFER_SIZE] = writeval;
if((i%BUFFER_SIZE == BUFFER_SIZE-1 || i == NVALUES-1))
write(fd, buffer, i%BUFFER_SIZE+1);
}
fsync(fd);
close(fd);
}
这是 C++ 程序:
int main()
{
ofstream ofs("/tmp/iofile2");
int i;
for(i=0; i<50000000; i++)
ofs << '\0';
ofs.flush();
ofs.close();
return 0;
}
感谢您的时间。