スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

大小比較の関数の最適化

大小比較して1,0,-1のいずれかを返す関数の最適化ネタ。

2つの整数を比較して、大きければ1、小さければ-1、同じなら0を返す関数を下記のように書いていたのだけど

某所で下記のようなコードをみつけて、わざわざこんな書き方するからには速度が違う筈、とか考えて速度比較してみた。

VisualStudio2008 + -O2 + Corei7 で実験したところ後者のほうが3割ぐらい速かった。
後者の書き方だとset??ていう条件レジスタを見て1or0をセットする命令が使われてジャンプが消えるのが原因のよう。
この命令boolの仕様(0or1をセット)と親和性が高いなーと思った。むしろこの命令があるからboolの仕様がこうなった?条件レジスタを見てあれこれしてくれるのはARMだけだと思ってた。

でも場合によっては美味しくない書き方である気がする。大抵の場合、比較だけじゃ終わらずに比較結果に基づいた後に続くコードがそれぞれある筈。
・比較結果(1,0,-1)をメモリに書き込んで終わる場合
・比較結果を何らかの算術演算に使用する(=結果にかかわらず後に続くコードが同じ)場合
・比較用の関数が外部関数として定義しなくちゃいけなくて(関数ポインタで参照できなければいけないとか)比較関数の速度だけが問われる場合
とかなら後者のほうが美味しいんだろうけど、上記のようなパターンに当てはまらず、比較の後に実行されるコードが異なるパターンだと素直にifで書いたほうが、そっちへ直接ジャンプできるぶん速くなりそう。

前者のアセンブラ

後者のアセンブラ

スポンサーサイト
検索フォーム
ユーザータグ

ICPC 2009 国内予選 ゲームプログラミング 

カテゴリ
最新記事
月別アーカイブ
最新コメント
最新トラックバック
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。