Swift における switch 文のパフォーマンス

#前言
ぶっちゃけ言います。クソです。正直 Swift の switch 文って、もしかして if 文の別の書き方だけなんじゃないの？と思うレベル。
まあ要するにアレです。Swift では数字だけでなくいろんな型も switch 文の条件として使えるってことだから、じゃあどうやって switch してるの？って考えると、確かに数字以外ならいちいち比較してみるしかないって気がしなくもないですけど…というか実際 switch 文で step over してみるとわかりますけど確かに一個ずつ演算しています。

#実演
というわけで実際やってみます。やり方は簡単です。適当に iOS プロジェクトつくって viewDidLoad とか didFinishLaunchingWithOptions とかで適当に下記のようなコードを動かしてみます。テストコードは100,000回ループして、0~100の乱数を作ってこの100パターンを switch 文と if 文それぞれの動作パフォーマンスを確認します。パフォーマンスは NSDate の timeIntervalSinceNow で動作時間を見ます。テストコードは以下のようです：

```swift
		let start = NSDate()
		for _ in 0 ..< 100000 {
			let i = arc4random_uniform(100)
			switch i {
			case  0: print(" 00 ")
			case  1: print(" 01 ")
			case  2: print(" 02 ")
			case  3: print(" 03 ")
			case  4: print(" 04 ")
			case  5: print(" 05 ")
			case  6: print(" 06 ")
			case  7: print(" 07 ")
			case  8: print(" 08 ")
			case  9: print(" 09 ")
			case 10: print(" 10 ")
			case 11: print(" 11 ")
			case 12: print(" 12 ")
			case 13: print(" 13 ")
			case 14: print(" 14 ")
			case 15: print(" 15 ")
			case 16: print(" 16 ")
			case 17: print(" 17 ")
			case 18: print(" 18 ")
			case 19: print(" 19 ")
			case 20: print(" 20 ")
			case 21: print(" 21 ")
			case 22: print(" 22 ")
			case 23: print(" 23 ")
			case 24: print(" 24 ")
			case 25: print(" 25 ")
			case 26: print(" 26 ")
			case 27: print(" 27 ")
			case 28: print(" 28 ")
			case 29: print(" 29 ")
			case 30: print(" 30 ")
			case 31: print(" 31 ")
			case 32: print(" 32 ")
			case 33: print(" 33 ")
			case 34: print(" 34 ")
			case 35: print(" 35 ")
			case 36: print(" 36 ")
			case 37: print(" 37 ")
			case 38: print(" 38 ")
			case 39: print(" 39 ")
			case 40: print(" 40 ")
			case 41: print(" 41 ")
			case 42: print(" 42 ")
			case 43: print(" 43 ")
			case 44: print(" 44 ")
			case 45: print(" 45 ")
			case 46: print(" 46 ")
			case 47: print(" 47 ")
			case 48: print(" 48 ")
			case 49: print(" 49 ")
			case 50: print(" 50 ")
			case 51: print(" 51 ")
			case 52: print(" 52 ")
			case 53: print(" 53 ")
			case 54: print(" 54 ")
			case 55: print(" 55 ")
			case 56: print(" 56 ")
			case 57: print(" 57 ")
			case 58: print(" 58 ")
			case 59: print(" 59 ")
			case 60: print(" 60 ")
			case 61: print(" 61 ")
			case 62: print(" 62 ")
			case 63: print(" 63 ")
			case 64: print(" 64 ")
			case 65: print(" 65 ")
			case 66: print(" 66 ")
			case 67: print(" 67 ")
			case 68: print(" 68 ")
			case 69: print(" 69 ")
			case 70: print(" 70 ")
			case 71: print(" 71 ")
			case 72: print(" 72 ")
			case 73: print(" 73 ")
			case 74: print(" 74 ")
			case 75: print(" 75 ")
			case 76: print(" 76 ")
			case 77: print(" 77 ")
			case 78: print(" 78 ")
			case 79: print(" 79 ")
			case 80: print(" 80 ")
			case 81: print(" 81 ")
			case 82: print(" 82 ")
			case 83: print(" 83 ")
			case 84: print(" 84 ")
			case 85: print(" 85 ")
			case 86: print(" 86 ")
			case 87: print(" 87 ")
			case 88: print(" 88 ")
			case 89: print(" 89 ")
			case 90: print(" 90 ")
			case 91: print(" 91 ")
			case 92: print(" 92 ")
			case 93: print(" 93 ")
			case 94: print(" 94 ")
			case 95: print(" 95 ")
			case 96: print(" 96 ")
			case 97: print(" 97 ")
			case 98: print(" 98 ")
			case 99: print(" 99 ")
			default: print(" ?? ")
			}
		}
		let time = -start.timeIntervalSinceNow
		println()
		println("time: \(time)")
		
		let start2 = NSDate()
		for _ in 0 ..< 100000 {
			let i = arc4random_uniform(100)
			if i == 0 { print("00") }
			else if i ==  1 { print(" 01 ") }
			else if i ==  2 { print(" 02 ") }
			else if i ==  3 { print(" 03 ") }
			else if i ==  4 { print(" 04 ") }
			else if i ==  5 { print(" 05 ") }
			else if i ==  6 { print(" 06 ") }
			else if i ==  7 { print(" 07 ") }
			else if i ==  8 { print(" 08 ") }
			else if i ==  9 { print(" 09 ") }
			else if i == 10 { print(" 10 ") }
			else if i == 11 { print(" 11 ") }
			else if i == 12 { print(" 12 ") }
			else if i == 13 { print(" 13 ") }
			else if i == 14 { print(" 14 ") }
			else if i == 15 { print(" 15 ") }
			else if i == 16 { print(" 16 ") }
			else if i == 17 { print(" 17 ") }
			else if i == 18 { print(" 18 ") }
			else if i == 19 { print(" 19 ") }
			else if i == 20 { print(" 20 ") }
			else if i == 21 { print(" 21 ") }
			else if i == 22 { print(" 22 ") }
			else if i == 23 { print(" 23 ") }
			else if i == 24 { print(" 24 ") }
			else if i == 25 { print(" 25 ") }
			else if i == 26 { print(" 26 ") }
			else if i == 27 { print(" 27 ") }
			else if i == 28 { print(" 28 ") }
			else if i == 29 { print(" 29 ") }
			else if i == 30 { print(" 30 ") }
			else if i == 31 { print(" 31 ") }
			else if i == 32 { print(" 32 ") }
			else if i == 33 { print(" 33 ") }
			else if i == 34 { print(" 34 ") }
			else if i == 35 { print(" 35 ") }
			else if i == 36 { print(" 36 ") }
			else if i == 37 { print(" 37 ") }
			else if i == 38 { print(" 38 ") }
			else if i == 39 { print(" 39 ") }
			else if i == 40 { print(" 40 ") }
			else if i == 41 { print(" 41 ") }
			else if i == 42 { print(" 42 ") }
			else if i == 43 { print(" 43 ") }
			else if i == 44 { print(" 44 ") }
			else if i == 45 { print(" 45 ") }
			else if i == 46 { print(" 46 ") }
			else if i == 47 { print(" 47 ") }
			else if i == 48 { print(" 48 ") }
			else if i == 49 { print(" 49 ") }
			else if i == 50 { print(" 50 ") }
			else if i == 51 { print(" 51 ") }
			else if i == 52 { print(" 52 ") }
			else if i == 53 { print(" 53 ") }
			else if i == 54 { print(" 54 ") }
			else if i == 55 { print(" 55 ") }
			else if i == 56 { print(" 56 ") }
			else if i == 57 { print(" 57 ") }
			else if i == 58 { print(" 58 ") }
			else if i == 59 { print(" 59 ") }
			else if i == 60 { print(" 60 ") }
			else if i == 61 { print(" 61 ") }
			else if i == 62 { print(" 62 ") }
			else if i == 63 { print(" 63 ") }
			else if i == 64 { print(" 64 ") }
			else if i == 65 { print(" 65 ") }
			else if i == 66 { print(" 66 ") }
			else if i == 67 { print(" 67 ") }
			else if i == 68 { print(" 68 ") }
			else if i == 69 { print(" 69 ") }
			else if i == 70 { print(" 70 ") }
			else if i == 71 { print(" 71 ") }
			else if i == 72 { print(" 72 ") }
			else if i == 73 { print(" 73 ") }
			else if i == 74 { print(" 74 ") }
			else if i == 75 { print(" 75 ") }
			else if i == 76 { print(" 76 ") }
			else if i == 77 { print(" 77 ") }
			else if i == 78 { print(" 78 ") }
			else if i == 79 { print(" 79 ") }
			else if i == 80 { print(" 80 ") }
			else if i == 81 { print(" 81 ") }
			else if i == 82 { print(" 82 ") }
			else if i == 83 { print(" 83 ") }
			else if i == 84 { print(" 84 ") }
			else if i == 85 { print(" 85 ") }
			else if i == 86 { print(" 86 ") }
			else if i == 87 { print(" 87 ") }
			else if i == 88 { print(" 88 ") }
			else if i == 89 { print(" 89 ") }
			else if i == 90 { print(" 90 ") }
			else if i == 91 { print(" 91 ") }
			else if i == 92 { print(" 92 ") }
			else if i == 93 { print(" 93 ") }
			else if i == 94 { print(" 94 ") }
			else if i == 95 { print(" 95 ") }
			else if i == 96 { print(" 96 ") }
			else if i == 97 { print(" 97 ") }
			else if i == 98 { print(" 98 ") }
			else if i == 99 { print(" 99 ") }
			else { print(" ?? ") }
		}
		let time2 = -start2.timeIntervalSinceNow
		println()
		println("time2: \(time2)")
```

#結論
はい、switch 文と if 文でやってることは完全に一緒です。そして実行時間はどうでしょうか？当方 iPhone 5s（iOS 8.1.2）でテストした結果としては、switch 文が2.16秒、 if 文が2.13秒と、誤差の範囲だと思えばぶっちゃけ同じ数字です。ちなみに当然ながら switch 文の条件を増やせば増やすほど、if 文と同じように遅くなっていきます。まあいちいち全部比較していくわけだから当然といえば当然ですね。switch 文で使える型が増えたのは嬉しいですけどせめて Int の場合は if 文と全く同じ動作するのやめて欲しい… switch 文の意味無いじゃん…