引続き、SUFARY vs ? の比較実験を行っています。 以下、知らない人には難しく見えるけど実はどうってことない話。 長年、Cでプログラムを組んでいるけど、今までメモリの確保に失敗するという事態に遭遇したことが無かった。 実際、WSでプログラム作るときに、malloc が失敗するなんてこと考えないし、 考えたとしても「malloc 失敗 → exit !」という一般的なコーディングだった。 今日、負荷実験ということで、同時に検索エンジンを数十個起動してたら、 メモリ確保(malloc)失敗が続出。これじゃちゃんと評価できない! 今までのコーディングはこんな感じ。
hoge = (char *)malloc(HOGE_SIZE);
if(hoge == NULL){
fprintf(stderr,"allocation failed.\n");
exit(1);
}
メモリ確保ができないくらいで、あきらめて終了してしまちゃ困るわけ(困るのは負荷実験のときだけという話もあるけどね)。
そこでメモリ確保に失敗したら、1秒待ってもういちど挑戦というようにコーディングした。こんな感じ。
while(1){
hoge = (char *)malloc(HOGE_SIZE);
if(hoge != NULL) break;
sleep(1);
}
待つ時間を増やしていく(倍にしていくとか)ようにしたほうが現実的かも。
どっかで聞いたことあるような話だね。
ともかく、これでなんとか動くようになって、実行時間の測定ができました。
良かった、良かった。
でも、メモリ確保できてなかったら sleep してるだけだから測定結果に意味あるのかなあという疑問も湧いてきます。
また、非常に危険なループなのでコンパイルの際に選択できるようにすべしとの意見もあります。まあ、そうだね。
で、売りもののプログラムではどうやってメモリ管理しているのかなあというのが疑問なのです。
比較対象のOT5(売りものです)は、
いくつ立ち上げても「メモリが足りない」なんて泣き事言わず各自黙々と働いているんだよな。偉いよなあ。