2010-07-27

可読性が悪いにもほどがある・・・と思った1関数

http://blog.livedoor.jp/dankogai/archives/51490675.html

inline U64 powmod(U64 base, U64 power, U64 mod){

return base >= UINT_MAX ? powmod_gmp(base, power, mod)

: power >= UINT_MAX ? powmod_gmp(base, power, mod)

: mod >= UINT_MAX ? powmod_gmp(base, power, mod)

: powmod_64(base, power, mod);

}

3項演算子を連打とか・・・

if(base  >= UINT_MAX){
 return powmod_gmp(base, power, mod);
}else if(base  >= UINT_MAX){
 return powmod_gmp(base, power, mod);
}else if(mod   >= UINT_MAX ){
 return powmod_gmp(base, power, mod)
}else{
 return powmod_64(base, power, mod);
}

って事で、要するに

if(base < UINT_MAX && power <  UINT_MAX && mod < UINT_MAX){
 return powmod_64(base, power, mod);
} else {
 return powmod_gmp(base, power, mod)
}

って事じゃないのか?実際Cは左辺優先評価で1つ目がFALSEの場合2つめ以後は評価されない(してはいけない)でelseにジャンプ だからif演算の回数だけなら等価

まぁ、確かに、パイプラインを考えればthen節とelse節は等価ではないので、データによって真ん中の書き方のほうが下より早いとか遅いという差はでるけど・・・

 

なくても、真ん中か、下の書き方でいいよなぁ。

まかり間違って

if(base >= UINT_MAX || base  >=  UINT_MAX || mod >= UINT_MAX){ 
 return powmod_gmp(base, power, mod)
}else{
 return powmod_64(base, power, mod);
}

と書いても、おそらく、コンパイラ先生がただしく最適化してくれればおなじになるだろう。正しく最適化しないと、コレは遅い可能性もあるが、そんなことはまず無いだろう。

 

いや?演算子が悪いとは言わないけど、チーム組んで初級の若いプログラマがこういうコードを読めるとは思わないし、読む必要があるとも思わないんだが・・・

ジェネリックに、みんなに分かりやすく。

トリッキーに書くのもいいけど、それは、速度かメモリかで恩恵が受けられる場合で、メリットがないなら、初心者でも読みやすく、メンテしやすくする。って間違ってるのかなぁ?

?連打の方が世の中読みやすいのか?

 

どうでもいいけど・・・UINT_MAX って、最大値+1じゃなくて、最大値だよなぁ・・・。確か>=の=の有り無し逆じゃね?

もっと、どうでもいいけど、mmレジスタとxmmレジスタmod演算ってクロック数違うんだっけ?だれか、教えて。ifでパイプライン崩すのとどっちがいいんだろう。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん