Skip to content

Instantly share code, notes, and snippets.

@pcantrell
Created December 11, 2015 05:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pcantrell/235054b4faa76738ac68 to your computer and use it in GitHub Desktop.
Save pcantrell/235054b4faa76738ac68 to your computer and use it in GitHub Desktop.
import Foundation
extension Array
{
func median() -> Element
{ return self[count / 2] }
}
func time(name: String, iters: Int, closure: Void -> Void) -> NSTimeInterval
{
print(name)
print("")
let reps = 9
let times: [NSTimeInterval] =
(0..<reps).map
{
iter in
let startTime = NSDate.timeIntervalSinceReferenceDate()
for _ in 0..<iters
{ closure() }
let time = NSDate.timeIntervalSinceReferenceDate() - startTime
print(" Iter \(iter): \(time)")
return time
}
let median = times.median()
print(" ——————————————")
print(" Median: \(median)")
print("")
return median
}
func timeForLoops(name: String, iters: Int, zipStride: Void -> Void, cStyle: Void -> Void)
{
print("—————— \(name) ——————")
print("")
let zipStrideTime = time("zip+stride", iters: iters, closure: zipStride)
let cStyleTime = time("C-style", iters: iters, closure: cStyle)
print("Zip+stride takes \(zipStrideTime / cStyleTime)x the time of C-style for")
print("")
}
timeForLoops(
"Paul’s comparison", iters: 5000000,
zipStride:
{
var sum = 0
for (i, j) in zip(100.stride(to: 0, by: -1), 200.stride(to: 0, by: -2))
{
if i % 2 == 0 { continue }
sum += i - j
}
},
cStyle:
{
var sum = 0
for var i = 100, j = 200; i > 0 && j > 0; i -= 1, j -= 2
{
if i % 2 == 0 { continue }
sum += i - j
}
}
)
let first = 10000000
let second = 20000000
timeForLoops(
"David’s comparison", iters: 40,
zipStride:
{
var sum = 0
for (i, j) in zip(first.stride(to: 0, by: -1), second.stride(to: 0, by: -2))
{
if i % 2 == 0 { continue }
sum += 1
}
},
cStyle:
{
var sum = 0
for var i = first, j = second; i > 0 && j > 0; i -= 1, j -= 2
{
if i % 2 == 0 { continue }
sum += 1
}
}
)
timeForLoops(
"David’s comparison, actually using indices in the loop", iters: 40,
zipStride:
{
var sum = 0
for (i, j) in zip(first.stride(to: 0, by: -1), second.stride(to: 0, by: -2))
{
if i % 2 == 0 { continue }
sum += i-j
}
},
cStyle:
{
var sum = 0
for var i = first, j = second; i > 0 && j > 0; i -= 1, j -= 2
{
if i % 2 == 0 { continue }
sum += i-j
}
}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment