Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
41
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Swiftで重い処理の処理時間を測定する

概要

Swiftでも、rubyのBenchmarkのように簡単に処理時間を計算するメソッドを書いた。
このメソッドを使うと、アプリの速度改善に役立つ。

Benchmarkクラス

Benchmark.swift

import Foundation

class Benchmark {

  // 開始時刻を保存する変数
  var startTime: NSDate
  var key: String

  // 処理開始
  init(key: String) {
    self.startTime = NSDate()
    self.key = key
  }

  // 処理終了
  func finish() {
    let elapsed = NSDate().timeIntervalSinceDate(self.startTime) as Double
    let formatedElapsed = String(format: "%.3f", elapsed)
    println("Benchmark: \(key), Elasped time: \(formatedElapsed)(s)")
  }

  // 処理をブロックで受け取る
  class func measure(key: String, block: () -> ()) {
    let benchmark = Benchmark(key: key)
    block()
    benchmark.finish()
  }
}

使い方

1. ブロックを渡す場合

Sample1.swift
Benchmark.measure("重いかもしれない処理1", block: {
  sleep(1)
  return
})

// => "Benchmark: 重いかもしれない処理1, Elasped time: 1.023(s)"

2. インスタンスを使う場合

基本的には「1」の使い方でいいが、測定したい部分(blockの中)で定義した変数はそのブロックから出ると使えなくなってしまう。

Sample2-NG.swift
// 生成に時間が掛かる重いクラス
class MyHeavyClass {
  init() {
    sleep(1)
  }

  func myMethod() {
  }
}

Benchmark.measure("重いかもしれない処理2", block: {
  let myHeavyValue = MyHeavyClass()
})

myHeavyValue.myMethod()
// => Use of unresolved identifier 'myHeavyValue'

その場合は以下の方法を使う。

Sample2-OK.swift
let myBenchMark = Benchmark(key: "重いかもしれない処理2")
let myHeavyValue = MyHeavyClass()
myBenchMark.finish()
// => "Benchmark: 重いかもしれない処理2, Elasped time: 1.025(s)"

myHeavyValue.myMethod()

ソースコード

https://github.com/tadyjp/BenchMark.playground
ここからダウンロードして試せます。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
41
Help us understand the problem. What are the problem?