リファクタリング プログラミング 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


関連記事

no image

How to apply JavaScript fixes (PHP)

※This article (Japanese) is translated from Google (English). After editing JavaScript, it is the ac …

正規表現で複数の箇所を入れ替える方法

複数の特定の箇所を入れ替えるテクニックです。 確認環境 Sakuraエディタ 置換方法 ここでは例として、:区切りの前後の文字列を入れ替えてみます。 置換前データ メニュー:AAA メニュー:BBB …

Springメモ(あれ、どうすんだっけ?)

@Autowiredアノテーションをつけることができる箇所(3つ) ・フィールド変数 ・コンストラクタの引数 ・setterの引数 ※引用 【後悔しないための入門書】Spring解体新書: Sprin …

【JdbcTemplate】Queryの書き方(更新系)

  前提 以下のテーブル(users)を持ち、格納するのはUserクラスという想定で説明していきます。 usersテーブル

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

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

記事を探す

SpringFramworkの良書

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

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