by konisi » 2008年1月05日(土) 23:32
速度を上げるべきところを関数化して、そこをアセンブリ言語で記述したDLLで置き換えるとか。
アセンブリ言語を使えば、足し算を行うのと同じ時間で3倍・5倍・9倍の値を求めることが可能な演算(LEA)があったりとかあるので便利だったりします。
ただし、ABより速いって程度の速度なら普通に出ますが、本格的に最適化をしようとすると
ペアリングがどうとかAGIストールだのパイプラインストールだのパーシャルレジスタストールだの
色々制約があったりして、最速コードを組み上げるのは結構難しかったりするのですが。
ABだけでやるなら、本当にその記述で速度が上がっているのかどうかを確認したりします。(数百万回実行してそれに要した時間を見るとか、実行ファイルを逆アセンブラにかけて解析するとかね。)
文字列系で速度を上げるならString使用は問題外としても、lstrcatをlstrcpyで置き換えるとか。
lstrcatだと文字列がどこで終わってるか判定する必要があるので、長い文字列を扱う場合に重くなるんですよね。
連結する文字列の長さがはっきりしている場合は、memcpyの方がいいと思います。
あとはVarPtrやらAddressOfやらの戻り値を何度も使う場合は、一度変数に代入しておくとか。
と、ここまで書いたのは本当に実行速度が求められるときに関して必要なことであって、
実行速度がそれほど重視されない場合は書きやすさ・読みやすさを優先するべきだとは思います。
速度を上げるべきところを関数化して、そこをアセンブリ言語で記述したDLLで置き換えるとか。
アセンブリ言語を使えば、足し算を行うのと同じ時間で3倍・5倍・9倍の値を求めることが可能な演算(LEA)があったりとかあるので便利だったりします。
ただし、ABより速いって程度の速度なら普通に出ますが、本格的に最適化をしようとすると
ペアリングがどうとかAGIストールだのパイプラインストールだのパーシャルレジスタストールだの
色々制約があったりして、最速コードを組み上げるのは結構難しかったりするのですが。
ABだけでやるなら、本当にその記述で速度が上がっているのかどうかを確認したりします。(数百万回実行してそれに要した時間を見るとか、実行ファイルを逆アセンブラにかけて解析するとかね。)
文字列系で速度を上げるならString使用は問題外としても、lstrcatをlstrcpyで置き換えるとか。
lstrcatだと文字列がどこで終わってるか判定する必要があるので、長い文字列を扱う場合に重くなるんですよね。
連結する文字列の長さがはっきりしている場合は、memcpyの方がいいと思います。
あとはVarPtrやらAddressOfやらの戻り値を何度も使う場合は、一度変数に代入しておくとか。
と、ここまで書いたのは[b]本当に[/b]実行速度が求められるときに関して必要なことであって、
実行速度がそれほど重視されない場合は書きやすさ・読みやすさを優先するべきだとは思います。