mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
64 lines
1.3 KiB
Swift
64 lines
1.3 KiB
Swift
// NibbleSort benchmark
|
|
//
|
|
// Source: https://gist.github.com/airspeedswift/f4daff4ea5c6de9e1fdf
|
|
|
|
import TestsUtils
|
|
|
|
public var NibbleSort = BenchmarkInfo(
|
|
name: "NibbleSort",
|
|
runFunction: run_NibbleSort,
|
|
tags: [.validation]
|
|
)
|
|
|
|
@inline(never)
|
|
public func run_NibbleSort(_ N: Int) {
|
|
let vRef: UInt64 = 0xfeedbba000000000
|
|
let v: UInt64 = 0xbadbeef
|
|
var c = NibbleCollection(v)
|
|
|
|
for _ in 1...10000*N {
|
|
c.val = v
|
|
c.sort()
|
|
|
|
if c.val != vRef {
|
|
break
|
|
}
|
|
}
|
|
|
|
CheckResults(c.val == vRef)
|
|
}
|
|
|
|
struct NibbleCollection: RandomAccessCollection, MutableCollection {
|
|
typealias Indices = CountableRange<UInt64>
|
|
|
|
var val: UInt64
|
|
init(_ val: UInt64) { self.val = val }
|
|
|
|
typealias Index = UInt64
|
|
let startIndex: UInt64 = 0
|
|
let endIndex: UInt64 = 16
|
|
|
|
subscript(bounds: Range<Index>) -> Slice<NibbleCollection> {
|
|
get {
|
|
fatalError("Should not be called. Added here to please the type checker")
|
|
}
|
|
set {
|
|
fatalError("Should not be called. Added here to please the type checker")
|
|
}
|
|
}
|
|
|
|
subscript(idx: UInt64) -> UInt64 {
|
|
get {
|
|
return (val >> (idx*4)) & 0xf
|
|
}
|
|
set(n) {
|
|
let mask = (0xf as UInt64) << (idx * 4)
|
|
val &= ~mask
|
|
val |= n << (idx * 4)
|
|
}
|
|
}
|
|
|
|
typealias Iterator = IndexingIterator<NibbleCollection>
|
|
func makeIterator() -> Iterator { return Iterator(_elements: self) }
|
|
}
|