以下は、ファイルに 50,000,000 バイトを書き込む 2 つのプログラムです。
C で記述された最初のプログラムは、バッファを使用します。このバッファは、任意の値が書き込まれると、ディスクに書き込み、50,000,000 バイトすべてが書き込まれるまでそのプロセスを繰り返します。バッファのサイズを大きくすると、プログラムの実行時間が短くなることに気付きました。たとえば、BUFFER_SIZE = 1 では、プログラムは ~88.0463 秒かかりましたが、BUFFER_SIZE = 1024 では、プログラムは ~1.7773 秒しかかかりませんでした。私が記録した最高の時間は、BUFFER_SIZE = 131072 のときでした。BUFFER_SIZE がそれよりも大きくなるにつれて、実際には少し時間がかかり始めていることに気付きました。
C++ で記述された 2 番目のプログラムは、ofstream を使用して一度に 1 バイトずつ書き込みます。驚いたことに、プログラムの実行にはわずか 1.87 秒しかかかりませんでした。BUFFER_SIZE = 1 の C プログラムのように、1 分ほどかかると予想していました。私のデータによると、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;
}
お時間をいただきありがとうございます。