リファクタリング プログラミング Java

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無しで実現できる。

 

コード全体

-リファクタリング, プログラミング, Java
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

MySQL-タイムゾーン設定すると起動しなくなる原因と対処方法

MySQLのタイムゾーン設定をすると、XAMPPでMySQLが起動できなる原因と対処法です。   目次 原因XAMPP起動時に表示されるエラーメッセージ対処方法timezonesをダウンロー …

no image

【MySQL】自テーブルのカラムの値を0埋めで更新する方法

構文

記載例

  UPDATE前後の値を比較 UPDATE …

なぜelse、else ifを書かないようにすべきなのか?

  目次 結論性別を判定する例Before: else句を使用した場合After: else句を使用しない場合日本語の会話に変換すると?Aさんの説明:elseありBさんの説明:ifのみまとめ …

Jacksonで日付がずれる場合、Timezone設定を直す

目次 現象原因対策 現象 JacksonでCSV出力する際、日付がズレて出力される。   原因 タイムゾーンの設定がTokyo/Asiaになっていない。   対策 applicat …

no image

【PHP】配列と連想配列と多次元配列の説明と使用例

目次 配列とは?定義例まとめ 配列とは? 1つの変数に複数の値を持つものです。 整数型や文字列型は1つの変数に1つの値を持ちますが、配列は同じようなデータの集まりを1つの変数に持つことができるようにな …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。