Chiharu の日記

絵描き C/C++ プログラマーの日記です。

メモリーよりもディスクが速いわけがない

その結果、Javaで1バイトの文字列を結合処理してからディスクに書き込んだ場合、ディスクへの直接書き込みと比べて約9,000倍の時間がかかったという。

http://developers.slashdot.jp/story/15/03/28/0747218/

元記事の Java コードを読みました。C 言語的には下記のようなことでしょうね。Cygwin で計測したらディスク版の方が断然速いですが、さすがにコードが意地悪すぎるかな。何事もケースバイケースだと思います。

#include <stdio.h>
#include <stdlib.h>

#define MAX 1000000

/* メモリー版 */
void memory() 
{
 unsigned char* ptr;
 size_t i;
 FILE* f;

 ptr = NULL;

 for (i = 0; i < MAX; i++) {
  ptr = realloc(ptr, i + 1);
  ptr[i] = '1';
 }

 f = fopen("tstm", "wb");
 fwrite(ptr, 1, MAX, f);
 fclose(f);

 free(ptr);
}

/* ディスク版 */
void disk()
{
 unsigned char buf[8196];
 FILE* f;
 size_t i, c;

 f = fopen("tstd", "wb");

 for (i = 0, c = 0; i < MAX; i++, c++) {
  if (c == sizeof(buf)) {
   fwrite(buf, 1, c, f);
   c = 0;
  }
  buf[c] = '1';
 }

 fwrite(buf, 1, c, f);
 fclose(f);
}

/* 計測 */
#include <time.h>

#define COUNT 1

int main()
{
 clock_t p, m, d;
 size_t i;

 p = clock();
 for (i = 0; i < COUNT; i++) {
  memory();
 }
 m = clock() - p;

 p = clock();
 for (i = 0; i < COUNT; i++) {
  disk();
 }
 d = clock() - p;

 printf("memory = %.2f ms\n", (double) m / CLOCKS_PER_SEC * 1000);
 printf("disk = %.2f ms\n", (double) d / CLOCKS_PER_SEC * 1000);

 return 0;
}