kei-p3’s blog

kei-pによる技術共有と思考整理

Swift で Benchmark して速度改善しよう

最近、 RubyRuby on Rails から離れ、iOS のアプリ開発をするようになりました。 iOSアプリ自体は初めてではないのですが、1 - 2年ぶりでその時も言語としては Objective-C をメインにしていたので、
やっと Swift デビュー をする感じになりました。

そんな、久しぶりの アプリ開発 でこれ欲しいなーという機能があったので作ってみました。

kei-p/Benchmark-swift

iOS (Xcode) で速度改善

速度改善する上で、一番重要なのは どこの処理どれだけの時間 がかかっているか。 これを測定するには、今までは やたらとログを貼りまくって 時間を測定するという方法をとってました。

// こんなやつ
let start = NSDate()
print("process - start")
sleep(1)
print("process step 1 \(NSDate().timeIntervalSinceDate(start))")
sleep(1)
print("process step 2 \(NSDate().timeIntervalSinceDate(start))")
sleep(1)
print("process - end \(NSDate().timeIntervalSinceDate(start))")

正直、時間図るために、このコード量。。。問題ありだろ。。 と思いながらも、こんな感じのコードをいつも渋々書いておりました。

しかし、 「せっかくの Swift デビューだし、 Podのライブラリも作ったこと無いし、ライブラリ作るか!」 と思いたち、いつも使い慣れてる ruby の benchmark に相当するクラスを作成してみました。

導入方法

Podfileに下記のように追加してください。

pod 'Benchmark', git: 'https://github.com/kei-p/Benchmark-swift.git'

使い方

使い方としては、以下の2通りを想定して作りました。

例1: 単純な計測

let b = Benchmark.measure("hoge") {
  // 計測したい処理
  sleep(10)
}
print(b)
Benchmark hoge {
 start  0.000 sec - 2016-09-30 03:10:46 +0000
 end    10.001 sec - 2016-09-30 03:10:56 +0000
}

例2: 一連の処理の各処理ごとの経過時間計測

// case 2
let b = Benchmark.start("hoge")
sleep(1)
b.lap("step1")
sleep(1)
b.lap("step2")
sleep(1)
b.end()
print(b)
Benchmark hoge {
 start  0.000 sec - 2016-09-30 03:10:56 +0000
 step1  1.001 sec - 2016-09-30 03:10:57 +0000
 step2  2.002 sec - 2016-09-30 03:10:58 +0000
 end    3.003 sec - 2016-09-30 03:10:59 +0000
}

さいごに

速度改善はまずどこが原因かを探るのが大変なので、探る作業自体をやりやすくするってのはかなり重要だなと思いました。

かなり機能の薄いライブラリですが、それでも pod install するだけで使いまわせる便利さは十分に発揮できそうな気がしてます!