8
8

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 5 years have passed since last update.

SwiftでDictionary型のストアド・プロパティへのアクセスが遅い

Last updated at Posted at 2014-07-11

はじめに

適当にコーディングしていたところ、妙に処理に時間が掛かる事があり、原因箇所を探ってみた所、Dictionary型のストアド・プロパティアクセス周りのようなので記録として残しておきます。

  • Xcode6 beta5 (2014/08/06) ※検証し直しました。
  • バグレポート提出済み(issueとして処理されているもよう)

検証1 internalなストアド・プロパティ

class StoredTest {
    var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}

iPad Airで実行した結果:

追加時間(秒) 検索時間(秒)
デバッグ実行 7.213 0.014
リリース実行 0.091 0.001

検証2 internalなストアド・プロパティかつNSObject派生

class StoredTest : UIViewController { // 何でも良いけどUIViewControllerで。
    var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}

iPad Airで実行した結果:

追加時間(秒) 検索時間(秒)
デバッグ実行 7.248 0.013
リリース実行 0.092 0.001

beta4の50秒掛かっていた不具合は改善されたもよう。

検証3 privateなストアド・プロパティかつNSObject派生

class StoredTest : UIViewController {
    private var dic: [Int: Int] = [:]
    
    func main() {
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}

iPad Airで実行した結果:

追加時間(秒) 検索時間(秒)
デバッグ実行 7.250 0.014
リリース実行 0.088 0.001

検証4 ローカル変数

class LocalTest {
    
    func main() {
        var dic: [Int: Int] = [:]
        
        // 辞書への追加テスト
        var start = NSDate()
        for key in 0..<1000 {
            dic[key] = 0
        }
        println("追加時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
        
        // 辞書からの検索テスト
        start = NSDate()
        var sum = 0
        for key in 0..<1000 {
            sum += dic[key]!
        }
        println("検索時間= \(NSDate().timeIntervalSinceDate(start)) 秒")
    }
}

iPad Airで実行した結果:

追加時間(秒) 検索時間(秒)
デバッグ実行 0.085 0.013
リリース実行 0.008 0.001

考察

1000件という比較的少ない件数を操作するだけでも、ローカル変数/ストアド・プロパティの違いでパフォーマンスにかなり影響が出る事が判りました。

beta4ではNSObject派生クラスのストアドプロパティへのアクセスが激重でしたが、beta5では他と変わらなくなったようですね。

相変わらずデバッグ実行時の追加に7秒近く掛かっていますが、これは出来ればもっと速くしてほしいところです。

8
8
2

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
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?