先日Qを投げたばかりですが、再度Qを投げさせてください。
現在、10分毎に起動し、約228Kbyteのファイルを約1600個取得し、
20程度のファイルに出力する処理。 を開発しております。
当プログラムを走らせたところ、デバッグ環境において約15分もかかってしまいました。
VC++6.0のプロファイル機能を用いて処理の分散率を計測したところ、
fopenを行う関数内で、出来るだけ処理を高速化したにもかかわらず、
12分もの時間がかかっておりました。
ここで質問なのですが、以下の処理を更に高速化することは可能でしょうか。
ご教授お願いいたします。
int DatGetFromFile( char *cFileName )
{
FILE *fp;
/* ファイル名を作成 */
if((fp=fopen(cFileName, "rb"))==NULL)
{
return ERR_FILE_OPEN;
}
else
{
/* 一括取得 */
fread( gcFileData, sizeof(char), sizeof(gcFileData) - 1, fp);
if(ferror(fp) != 0)
{
return ERR_FILE_READ;
}
}
fclose(fp);
return(NORMAL);
}
※ gcFileData にはファイルを一括取得できるバッファサイズ(228KByte)が用意されています。
※ MFCでのデバッグを行いましたが、実際に稼働する環境はUNIX(SunOS 5.8)です。 よって CFileクラス等を使うことはできません。
もっと複雑なルーチンを単純化するとかならば高速化も見込めますが、ここまでシンプルだと改善のしようがないような気がします。
ならば、あとはメモリを浪費する方向に走るか、もっと根本的に変えるか…。
例えば、fopen と fclose が遅くて、毎回開くファイルが決まっているなら、プログラム起動しっぱなし、ファイル開きっぱなしにするとか。
同時に開けるファイル数の制限とかあったら無理ですね…
例えば、ファイルフォーマットを変えて複数のファイルをひとつにまとめ、fopen と fclose の回数を減らすとか。
#全部インラインアセンブラで書くなんていう無茶もありますが、おすすめしません。
>MFCでのデバッグを行いましたが、実際に稼働する環境はUNIX(SunOS 5.8)です。 よって CFileクラス等を使うことはできません。
MFC でのデバッグではなく、VC++ でのデバッグだと思います。
あくまで参考ですが・・・
Win32 API の方を使ってみるとか、また、システムがファイルの
リード・ライトに使用するバッファを、許可・不許可するとか。
またそのバッファの大きさを調整してみるとか・・・
試行錯誤する手はまだあると思います。
バッファの制御はWin32 API側にありますが、MFCやライブラリ内
にあったかについては未確認です。
バッファサイズについては、OSに依存します。
● 最終の稼動環境が、UNIXであると書かれています。
とすると、Windows上でデバッグしても無意味では?
UNIX環境でもバッファリング制御はC言語で用意されて
いたと思いますが、手元に環境が無いので、確認できません。
よって、あくまで試行錯誤して頂くしかないと思います。
以上。
> またそのバッファの大きさを調整してみるとか・・・
> バッファの制御はWin32 API側にありますが、MFCやライブラリ内
> にあったかについては未確認です。
Cの標準関数に
setbuf
setvbuf
というのがあります。
setbuf より setvbuf が勧められているようです。(VCの話ですが)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt_setvbuf.asp
1600個のファイルを処理して12分ってことは、
1ファイルあたりの処理が0.45秒。
妥当なせんだと思いますが
ツイート | ![]() |