【1万回検証】switchとifの実行速度、結局どっちが早いの

目次

以前からswitchを使える場面ではswitchを使い、なんならif文を無理にswitchで書き直したりなどもありました。仕事中ふと「なんで僕switchにこんなこだわってるんだ」と思い、記憶を辿ってみるといつしかswitchとifの使い分けに悩んでいた時にどこかで『ifは総当たり、switchは並行して調べていくからsiwtchの方が早い』という情報を目にしたことがあり、それ以来switchを使うようにしていることを思い出したのです。

ifとswitchの処理構造

👆『ifは総当たり、switchは並行して調べていくからsiwtchの方が早い』のイメージ

そこで仕事中の隙間時間を使い、少し検証してみました。

結果

検証に使ったソースコード

jsは上のcodepenに載せてあるのでこちらではphpを。

php
<script>

// 1000の条件分岐をするif文生成
const loopIf = () =>{
const x = 1000;
const startTime = performance.now();
<?php
$num = 0;
while ($num++ < 1000){
  if ($num === 1){
    echo "if (x === 1){\nconsole.log(1)\n}";
    continue;
  };
  echo "else if(x === ".$num."){\nconsole.log(".$num.")\n}";
}
?>

const endTime = performance.now();
return (endTime - startTime);
}

// 1000の条件分岐をするswitch文生成
const loopSwitch = () => {
const y = 1000;
const startTime = performance.now();
switch (y) {
<?php
$num = 0;
while ($num++ < 1000){
  echo "case ".$num.":\nconsole.log(".$num.")\nbreak;\n";
}
?>
}
const endTime = performance.now()
return (endTime - startTime)
}

// 結果を入れる用の空配列
let resultIf = [],
resultSwitch = [];

// 1万回繰り返し実行し、結果を配列に入れていく
for (let i = 0; i <= 10000; i++) {
  resultIf.push(loopIf());
  resultSwitch.push(loopSwitch())
}

// 平均値を求めるための合計値を算出
let sumIf = 0,
sumSwitch = 0;
resultIf.forEach((r)=> sumIf += r);
resultSwitch.forEach((r)=> sumSwitch += r);

// 出力
console.log("ifの平均値: " + sumIf / resultIf.length);
console.log("switchの平均値: " + sumSwitch / resultSwitch.length);

</script>

検証手順

まず、こういうJSを用意します。

js
const x = 1000,
  y = 1000;

if(x === 1){
  console.log(x)
}else if(x === 2){
  ...
} ...{
  ...
}else if(x === 1000){
  console.log(x);
}

switch (y) {
  case 1:
  case 2:
  ...
  case 1000:
    console.log(y);
    break;
}

さすがに手作業でやると骨が折れるので僕の場合はphpで用意しました。

php
<script>
const loopIf = () =>{
const x = 1000;
<?php
$num = 0;
while ($num++ < 1000){
  if ($num === 1){
    echo "if (x === 1){\nconsole.log(1)\n}";
    continue;
  };
  echo "else if(x === ".$num."){\nconsole.log(".$num.")\n}";
}
?>
};
// switchも同じように
</script>

これで1000個の条件分岐がついたif文とswitch文ができあがります。この関数の一番上と一番下に時間を計測する処理を書き、その計測結果を返すようにします。

php
<script>
const loopIf = () =>{
const x = 1000;
const startTime = performance.now();
<?php
$num = 0;
while ($num++ < 1000){
  if ($num === 1){
    echo "if (x === 1){\nconsole.log(1)\n}";
    continue;
  };
  echo "else if(x === ".$num."){\nconsole.log(".$num.")\n}";
}
?>

const endTime = performance.now();
return (endTime - startTime);
}
// switchの方にも同じように処理を書く
</script>

試しにconsole.log(loopIf();)を末尾に付け足しこれを実行してみると、

ifとswitchのスピード比較

こんなふうに1000個の条件分岐のついたif文が完了するまでに約0.18秒かかったことがわかります。

これを1万回繰り返し、その平均値を取ってみました。

結果をもう少しだけ詳しく

ifとswitchのスピード比較

1万回をさらに数回やることで結果的には10万回近く実行したのですが、どれもswitchの方が0.01秒早いですね。規模の大きい開発や分岐ではswitchを使った方が良さそうではありますが、個人開発レベルではifを使っても大して変わらなそうです。

だとするとifの方が使い勝手いいので僕はifを使いたいです……

処理を重くしたらどうなるか?

今回はif/switchの中身の処理はconsole.log()のみでした。が、実際はそんな軽い処理で終わることはないと思うので、その部分を

js
const loop = () => {
  for (let i = 0; i < 100; i++) {
    document.querySelector("#target").insertAdjacentHTML("beforeend", `<li>${i}</li>`);
  }
}

こんな感じの割とハードな処理に変更しました。さすがに1万回これを繰り返すとパソコンが死んでしまいそうな気がしたので100回に。その結果が以下です。

if/switch 結果
ifの平均値 6.487732267274835
switchの平均値 6.45995005030712

ここまでの処理でもその差0.02秒。そんな変わりませんね……。

  • SNSでシェアしよう
  • Twitterでシェア
  • FaceBookでシェア
  • Lineでシェア
  • 記事タイトルとURLをコピー
トップへ戻るボタン

\ HOME /

トップへ戻る