CrystalDiskMarkに関することなら何でもOKの掲示板です。
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
60 / 72 ←次へ | 前へ→

SetFilePointer()の2GBoverについて
←back ↑menu ↑top forward→
 やま  - 10/12/4(土) 8:56 -

引用なし
パスワード
   ひよひよさん、おはようございます。

CrystalDiskMarkで使用されているSetFilePointer()ですが、現在のソースだと、
2GB以上の領域にアクセスできないのではないでしょうか? もしそうなら、修正
してもらえるとありがたいです。

発端は、下の2ちゃんねるのスレッドの548、549、554、556、574なのですが、
RR4K、RW4Kで、サイズ1GBより4GBの時の方が性能が良いという話がでています。
http://hibari.2ch.net/test/read.cgi/jisaku/1284672065/

Process Monitorでdiskmark.exeの動きを見ていると、4GB時にファイルポインタの
オフセットが連続している部分がかなりの頻度で見られました。
----(Process MonitorログのReadFile部分のオフセット、データ長を抜粋)
Offset: 1,829,421,056, Length: 4,096
Offset: 1,444,057,088, Length: 4,096
Offset: 800,301,056, Length: 4,096
Offset: 800,305,152, Length: 4,096  << ここ
Offset: 812,011,520, Length: 4,096
Offset: 812,015,616, Length: 4,096  << ここ
Offset: 812,019,712, Length: 4,096  << ここ
Offset: 1,855,713,280, Length: 4,096
Offset: 910,721,024, Length: 4,096
----

ソース(例えば 3.0.0hのDiskBench.cpp 603行目、下)とログを合わせて考えると、
----
 SetFilePointer(hFile, (xor128() % split) * bufSize, NULL, FILE_BEGIN);
 result = ReadFile(hFile, buf, bufSize, &readSize, NULL);
----
・SetFilePointer()の第3引数がNULLなので、2GB以上の領域はアクセスできない。
・第2引数はLONGなので、2GB以上のオフセットは負数に見える。
・SetFilePointer()は、FILE_BEGIN指定時、負数のオフセットはエラーになる。
 (と思う。負数でエラーになるかは調べていません)
・エラーチェックをしてないので次のReadFile()を実行。
・ファイルポインタが動かないので、ReadFile()は、直前のRead完了位置からの
 シーケンシャルアクセスとなる。(結果、4GB時の性能が良く見える)

となっているのではないかと考えています。

#2Gとか4Gとか2Tとか、面倒くさいですね。(^_^;

3,328 hits

SetFilePointer()の2GBoverについて やま 10/12/4(土) 8:56
Re:SetFilePointer()の2GBoverについて ひよひよ 10/12/4(土) 11:11

60 / 72 ←次へ | 前へ→
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
ページ:  ┃  記事番号:   
27949
(SS)C-BOARD v3.8(とほほ改ver2.1) is Free