elseを使わないことでパフォーマンスが下がる場合の対処法

当ページのリンクには広告が含まれています。

 

目次

状況

前回記事(なぜelse、else ifを書かないようにすべきなのか?)のような
ifのみで判定されており、それがfor文等の繰り返し処理の中にある場合は
パフォーマンスが下がる。

 

対処法

メソッドを切り出し、早期リターンとする。

 

10億回のfor文でパフォーマンス評価

else有り、else無しで評価してみた。
(測定単位:ミリ秒)

else 有り

if文条件に当てはまれば、その時点で判定は終了するため、
より最初の方(上記の場合は、”man”)であるほど、判定は速く終了する。

<結果>
man :344
woman :343
other :2250
(未設定):1953

else 無し

全てのif文を判定するため、必ず一定の処理時間がかかる。

<結果>
man :1938
woman :2219
other :2212
(未設定):1898

結果(else無しは一定して遅い)

man、womanはelse有りの方が速い。
理由は、if文条件に合致したあとの後続処理(otheのif文等)は行われないため。
else無しの場合は、すべてのif文を実行するので処理が遅くなる。

上記の結果から、else有りと同じロジックに修正することで改善を試みる。
方法として、else無しをメソッドに切出して早期リターンとする。

 

パフォーマンス改善

else 無し AND メソッド切り出しして早期リターン

if文条件に当てはまれば判定結果をリターンするようにしたため、
後続のif文判定が行われない。

<結果>
man :321
woman :320
other :2199
(未設定):1863

結果(最速になった)

単位(ミリ秒)man(男性)woman(女性)other(その他)""(未設定)
else有り34434322501953
else無し1938221922121898
else無し
(早期リターン)
32132021991863

全3パターンで最速になりました。
else有りよりもわずかに早くなっているのは、「else」自体の処理が無いためと推察しています。

 

まとめ

・else有りだと、判定条件の順番によっては速く処理される。
・else無しだと、すべての判定を行うため、一律に処理時間がかかる。
・メソッドに切り出して早期リターンとすると、else有りと同等の処理速度をelse無しで実現できる。

 

コード全体

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次