次のソースを、CreateFile(Win32API)への置き換えを考えています。
MSDNで調べて、CreateFileにFILE_FLAG_WRITE_THROUGHを指定すればキャッシュされな
い。
とあり、試したのですがあまり効いていない様に見えました。
あまり効いていない。とは、即時に書き込まれる場合もあるが遅延書き込み中(?)の場合
もありました。
ノンキャッシュとは、ノンバッファリングと違うのでしょうか?
Log::Log()
{
m_file = 0 ;
}
Log::~Log()
{
close( m_file ) ;
}
bool Log::OpenLog( const char *fPath )
{
m_file = fopen( fPath , a+ ) ;
setvbuf( m_file , NULL , _IONBF , 0 ) ;
}
bool Log::Write( const char *buff )
{
fprintf( m_file , %s\r\n , buff ) ;
fflush( m_file ) ;
}
FILE_FLAG_NO_BUFFERINGは制約厳しいみたなので避けています・・・
>ノンキャッシュとは、ノンバッファリングと違うのでしょうか?
違うと思います。
一般論で言うと
キャッシュは、ファイルに書き出し済みのデータを保持しておいて読み出しの高速化を
図るプロセスグローバルなサービス。
バッファは、小刻みな I/O をバッファを介すことで実際の I/O の回数を減らして性能
向上を図るプロセスローカルなサービス。
ではないかと。
> ノンキャッシュ
ノンキャッシュは文字通りキャッシュしないことであり、これをすると一般的に処理速度
が落ちます(悪化します)。そのかわり急にPCの電源が切れた場合でも、HDDに無事に格
納されている可能性が高まります。逆にキャッシュしてれば速度は上がりますが、電源が
切れた場合に失われる可能性が高まります。
> あまり効いていない様に見えました。
OSのメモリ上でキャッシュされている場合もあれば、HDDのキャッシュ上でキャッシュさ
れている場合もありますし、これを一般ユーザーが体感するのは難しい気がします。HDD
メーカー等の計測装置じゃないと無理じゃないでしょうか?
普通HDDのキャッシュと言うとこういう意味だと思いますが…
ちょっと質問の仕方が悪かったです(__)スミマセン
Win32APIで、setvbuf( m_file , NULL , _IONBF , 0 ) に中る処理って存在しないの
か?
だったのです。が、置き換え中止となったので終了とさせていただきます。
回答してくれた方々には感謝です。
そういうのは質問の仕方が悪かったのではなく、用語を含めて基本的な知識が無いだけだ
と思いますがね。まあ、そういうのを自分で認めるのは難しいですな。