はじめに
適当にコーディングしていたところ、妙に処理に時間が掛かる事があり、原因箇所を探ってみた所、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秒近く掛かっていますが、これは出来ればもっと速くしてほしいところです。