アカウント名:
パスワード:
ディスク書き込みにBufferedWriterクラスを使ってました。なのでJava版に関しては「直接ディスクに書き込んでいる」わけではありません。
C 言語的にいうとこんな感じでしょうか。だとすれば後者の方が断然速いですね。(ちょっとコードが意地悪かな)
#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[8096]; 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);}
それ以上に元のコードは意地悪だけどね。reallocはmallocに変えて毎回サイズを増やした領域を確保し、前の領域を解放、を繰り返すくらいやらないと元のコードと同等にはならない。
8096って一体どこから出てきたのか(2の累乗にしたいのなら8192)
https://gist.github.com/taku0/e68851bf357dda0f989c [github.com]
実際測ってみました。100万文字を書き込んでいます。
FileWriter: 約50 msBufferedWriter + FileWriter: 最初のうちは約30 ms、120回目ぐらいからJITが効いて13 msStringBuilder + FileWriter: 14 ms
CPU: Core i7 4500Uストレージ: CFD販売 CSSD-M256HLHG5QOS: Linux 3.14.35 x86_64JVM: Oracle JVM 1.8.0_40, server VM
途中sleep入れてるのはCPUが熱くなって遅くなるのを防ぐためです(本当は設定を変えてTurbo Boost等を無効にするのが正しいのですが手抜きです)。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs
Java版のコード見たら (スコア:5, すばらしい洞察)
ディスク書き込みにBufferedWriterクラスを使ってました。なのでJava版に関しては「直接ディスクに書き込んでいる」わけではありません。
Re:Java版のコード見たら (スコア:3, 参考になる)
C 言語的にいうとこんな感じでしょうか。だとすれば後者の方が断然速いですね。(ちょっとコードが意地悪かな)
#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[8096];
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);
}
Re: (スコア:0)
それ以上に元のコードは意地悪だけどね。
reallocはmallocに変えて毎回サイズを増やした領域を確保し、前の領域を解放、を繰り返すくらいやらないと元のコードと同等にはならない。
Re: (スコア:0)
8096って一体どこから出てきたのか(2の累乗にしたいのなら8192)
Re: (スコア:0)
Re:Java版のコード見たら (スコア:2)
https://gist.github.com/taku0/e68851bf357dda0f989c [github.com]
実際測ってみました。100万文字を書き込んでいます。
FileWriter: 約50 ms
BufferedWriter + FileWriter: 最初のうちは約30 ms、120回目ぐらいからJITが効いて13 ms
StringBuilder + FileWriter: 14 ms
CPU: Core i7 4500U
ストレージ: CFD販売 CSSD-M256HLHG5Q
OS: Linux 3.14.35 x86_64
JVM: Oracle JVM 1.8.0_40, server VM
途中sleep入れてるのはCPUが熱くなって遅くなるのを防ぐためです(本当は設定を変えてTurbo Boost等を無効にするのが正しいのですが手抜きです)。