この日記はGNSで生成しています。 |
_ Windows全体でときどき発生する現象なのだが、「単一スレッドでずっとBitBltし続けていると、内蔵タイマーの更新が追いつかなくなることがある」という不具合が発生することがある。つまり、
DWORD start, count; start = GetTickCount(); count = 0 while ( GetTickCount() < start+10000 ) { BitBlt(...); count++; }
_ は「10秒間BltBltし続ける」という処理だが、これが「10秒で終わらない」ということが発生する*1、というわけ。10秒で測るところが20秒動いてたら倍の値になるのは当然。それどころか、下手すると永久に終わらなくてリセットする羽目になることすらある。
_ 多くのベンチマークプログラムで「単純なビットマップ転送の能力を測る」というテストが実装されていないのは、おそらくこのため。ちなみにわしが最近よく使うCrystalMarkの開発履歴の「2002/9/16: 0.6.15.X」に「GDI4(BitBlt) テストは一部の環境で致命的な問題を起こすことがあるため廃止」という項目があるのはこれだろうし、HDBENCHでグラデーションバーがスクロールするテスト項目で「いつまでたってもテストが終わらない」という経験のある人がいるのもこのためだと思う。
*1:
このコード、このまま使うと「49日問題」にひっかかるので注意。
メールはこちらへ...[後藤浩昭 / Hiroaki GOTO / GORRY / gorry@hauN.org]