11
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

駆け出しプログラマ向け、実務で使える「効率性」ってなに?

Posted at

前置き

こちらの記事は筆者が備忘録的にまとめたものです。
せっかく来てくれた読者の皆様にとっても役に立つように意識して書いてみましたので、
是非最後まで読んでみてください。では、Let us begin!

効率性(Efficiency)

こうりつせい とは

辞書的な説明

日本語だと

経済学において、効率性(こうりつせい)とは、資源・財の配分について無駄のないことを意味する。

や効率の説明として

機械が有効に働いてなした仕事の量とそれに供給した総エネルギーとの比率。また、仕事の能率。

英語だと

the state or quality of being efficient.

IT用語的には

目的達成の際にリソースを無駄に消費しないことを意味する。この場合のリソースとはメモリ使用量とプロセッサ使用時間である。

つまり

いかに寄り道や無駄な仕事をせず目的達成ができるか、その状態やクオリティ、みたいなことろでしょうか
IT用語としては、これ↓に尽きそうです。

目的達成の際にリソースを無駄に消費しないこと

効率性をコードに適用した例

ある名前がリストに登録されているかを確認し、登録状態に応じて何かの処理をしてくれる関数、を例にしてみましょう。

適用前(効率性 改善前のコード)

javascript
const registeredList = ["Haruka", "Toshi", "Yohei"]; // 登録されている名前のリスト

// 引数に渡された名前をもとに何かする関数
function doSomething(searchName) {
  let isFound = false; // 見つかったかどうか。初期値は false。
  for (const name of registeredList) {
    if (name === searchName){
      isFound = true; // 見つかったから true
    }
  }
  if (isFound){ // true のときの処理
    console.log("do something ...")
  }
  else { // false のときの処理
    console.log("do something else ...")
  }
} 

doSomething("Haruka") // 処理の呼び出し

解説

引数の名前(searchNameの値)が、registeredListに存在するかどうかを確認し、存在する(配列内の文字列と一致する)とき、
isFoundtrue にし、そうでない場合は初期値の false のままになっています。

その後、if分岐で isFound の値に応じて何かしらの処理をしてくれています。

問題点

上記の例では登録されている名前が3つしかないので、そこまで問題はなさそうです。

しかし、もし登録されている名前が 100,000個 など沢山存在する場合はどうでしょうか?
今のままだと、検索対象の名前が100,000個の名前リストのうち、1つ目の名前と一致したとしても、
残りの99,999個の要素と一致するかどうかの処理を続行してしまいます。

もう見つかっているのにまだ仕事をし続けているなんて、メモリを無駄に使っていますし、
プロセッサも無駄に長い時間働かされて、かわいそうですよね。効率性があるとは言えなそうです。

では効率性を高めてみましょう。

適用後(効率性 改善後のコード)

やること

  • 名前が一致した時点で、 break で for文の処理から抜け出す
javascript
const registeredList = ["Haruka", "Toshi", "Yohei"];

function doSomething(searchName) {
  let isFound = false;
  for (const name of registeredList) {
    if (name === searchName){
      isFound = true;
      break; // <--- これだけ追加
    }
  }
  if (isFound){
    console.log("do something ...")
  }
  else {
    console.log("do something else ...")
  }
} 

doSomething("Haruka") // 処理の呼び出し

いかがでしょうか。(コード自体はもっと改善できそうですが)
一致する名前が見つかって isFoundtrue に変わった直後にfor文を抜け出すようになりました。

つまり、"Haruka" という名前が見つかった時点で、残りの名前チェックをする必要がなくなったのです。

今回は簡単な例で、簡単な変更ですが、正直バカにできません。
大規模なデータを扱うようなシステムであればこの break 一つで、
ユーザがシステムを使い続けてくれるか、離れてしまうか、なんて話になるかもしれないのです。

今回の効率性改善によるメリット

  • 必要最低限だけの処理を行うようになりました(効率性UP)
    • 無駄なメモリ消費と、プロセッサの使用時間が改善されました。

まとめ

  • 効率性とは、目的達成の際にリソースを無駄に消費しないこと
  • 効率性は、リソースを無駄に消費しないだけでなく、システムを使ってくれるユーザの満足度にも影響してくる。

参考

11
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?