No.8493/Re[24]: NO TITLE |
■投稿者/ 開発者 -(2012/11/24(Sat) 11:09:57)
|
●himajin925さん お知恵を頂き、ありがとうございます!
>(1)HeapCreate はプログラムから明に呼び出しているのでしょうか?それとも VS のライブラリから(勝手に、というか)呼び出されているのでしょうか? 後者です。 Museプログラム上では、HeapCreateを発行していません。 ただ、Museが発行したmallocから、HeapAllocが利用されていると思います。
余談ではありますが、 Muse(V6.20)開発の折、データロード速度が低下したのをきっかけにいろいろ調べました。
例えば、 http://www7a.biglobe.ne.jp/~tsuneoka/win32sub2/10.html # Cランタイムルーチンの関数は、 # OSの内部構造を理解していない開発者が Win32 API を利用して作成したものよりは # 機能、性能共に優れていることがほとんどです。 # 実際にmalloc関数 と 代表的なメモリ管理APIを利用したベンチマークテストを実行してみると分かります。 # 2048バイトのメモリの取得・解放を10万回ループさせてみると、 # malloc と、 Win32 API LocalAlloc, GlobalAlloc では、処理速度の差が20倍程度ありました。
http://ir9.jp/prog/ayu/datlog/tech_win32api/1006783012/1006783012_03.html # 542 名前:511 :02/02/02 10:55 # 実際やってみました。いろいろ適当なプログラムですが # ・・・ # 結局malloc()よりHeapAlloc()の方が約1.9倍遅かったです。
他にも同じ傾向の主張をしているサイトが多かったため、 プログラム全域に渡ってCランタイムを中心とするコーディングに改修しました。 当初は、この改修が災いしたのかとも思いましたが、 過去のMuse(V3.1)まで遡っても症状が出るので、因果関係は薄いと見ています。
>(2)もう一つやってみていただきたい事があるのですが、プログラムの先頭のあたりで setlocale(LC_ALL, "Japanese"); を指定すると、どうでしょう? V6.26で(V6.26aではない)試してみました。 結果は、変化無しでした。
また、純正培養Museでも試してみました。 これも結果は、変化無しでした。
●Elekenさん > カーネルのバグで、NULL 終端を越えて走査しようとしてしまう・・・ もしそうだとすると、[8458]で浅川さんがつぶやいた、 > むしろこの場合XPのOS側にバグがあると考えたほうが自然かもしれません。 ということなのかもしれませんね。
> この NULL 終端がヒープ末尾に来る文字列の問題は、以下の簡単なプログラムで確認できます。 素晴らしい! これこそ、純正培養アプリケーションですね。
> HeapAlloc を呼び出した時点の残り割り当て可能領域に依存します。 思い当たる節があります。 純正培養Museを作る過程で、本来必要なFree()部分をコメントアウトしたら、症状が出なくなりました。 また、機能を削り取ることで不要となった構造体のメンバをコメントアウトしたら、症状が出なくなったこともありました。
> こちらの環境 (WinXP, コンパイラ VC++6.0) では、少なくとも > (ヒープ領域サイズ, 割り当てサイズ) = (16384, 32), (16384, 24), (8192, 24), (8192, 16) のときに発生します。 つまり、VS2005でのビルドは条件ではなかった! ついに真因を突き止めたような感じですね。
どこかのサイトに、有効な回避手段が掲載されていないかなぁ〜。 |
|