Skip to content

Commit

Permalink
[benchmark] Add DictionaryKeysContains
Browse files Browse the repository at this point in the history
  • Loading branch information
koher committed May 2, 2018
1 parent 6723cc9 commit 903f55b
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
1 change: 1 addition & 0 deletions benchmark/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ set(SWIFT_BENCH_MODULES
single-source/DictionaryBridge
single-source/DictionaryCopy
single-source/DictionaryGroup
single-source/DictionaryKeysContains
single-source/DictionaryLiteral
single-source/DictionaryRemove
single-source/DictionarySubscriptDefault
Expand Down
70 changes: 70 additions & 0 deletions benchmark/single-source/DictionaryKeysContains.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//===--- DictionaryKeysContains.swift -------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

// This benchmark checks if keys.contains(key) is executed in O(1)
// even when wrapping a NSDictionary
import TestsUtils
import Foundation

#if _runtime(_ObjC)
public let DictionaryKeysContains = [
BenchmarkInfo(
name: "DictionaryKeysContainsNative",
runFunction: run_DictionaryKeysContains,
tags: [.validation, .api, .Dictionary],
setUpFunction: setup_DictionaryKeysContainsNative,
tearDownFunction: teardown_DictionaryKeysContains),
BenchmarkInfo(
name: "DictionaryKeysContainsCocoa",
runFunction: run_DictionaryKeysContains,
tags: [.validation, .api, .Dictionary],
setUpFunction: setup_DictionaryKeysContainsCocoa,
tearDownFunction: teardown_DictionaryKeysContains),
]
#else
public let DictionaryKeysContains = [
BenchmarkInfo(
name: "DictionaryKeysContainsNative",
runFunction: run_DictionaryKeysContains,
tags: [.validation, .api, .Dictionary],
setUpFunction: setup_DictionaryKeysContainsNative,
tearDownFunction: teardown_DictionaryKeysContains),
]
#endif

private var dictionary: [NSString: NSString]!

private func setup_DictionaryKeysContainsNative() {
let keyValuePairs = (1...1_000_000).map { ("\($0)" as NSString, "\($0)" as NSString) }
dictionary = [NSString: NSString](uniqueKeysWithValues: keyValuePairs)
}

#if _runtime(_ObjC)
private func setup_DictionaryKeysContainsCocoa() {
let keyValuePairs = (1...1_000_000).map { ("\($0)" as NSString, "\($0)" as NSString) }
let nativeDictionary = [NSString: NSString](uniqueKeysWithValues: keyValuePairs)
dictionary = (NSDictionary(dictionary: nativeDictionary) as! [NSString: NSString])
}
#endif

private func teardown_DictionaryKeysContains() {
dictionary = nil
}

@inline(never)
public func run_DictionaryKeysContains(_ N: Int) {
for _ in 0..<(N * 100) {
CheckResults(dictionary.keys.contains("42"))
CheckResults(!dictionary.keys.contains("-1"))
}
}

2 changes: 2 additions & 0 deletions benchmark/utils/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import DictTest4Legacy
import DictionaryBridge
import DictionaryCopy
import DictionaryGroup
import DictionaryKeysContains
import DictionaryLiteral
import DictionaryRemove
import DictionarySubscriptDefault
Expand Down Expand Up @@ -208,6 +209,7 @@ registerBenchmark(Dictionary4Legacy)
registerBenchmark(DictionaryBridge)
registerBenchmark(DictionaryCopy)
registerBenchmark(DictionaryGroup)
registerBenchmark(DictionaryKeysContains)
registerBenchmark(DictionaryLiteral)
registerBenchmark(DictionaryRemove)
registerBenchmark(DictionarySubscriptDefault)
Expand Down

0 comments on commit 903f55b

Please sign in to comment.