Skip to content

Instantly share code, notes, and snippets.

@andersio
Last active April 23, 2017 16:02
Show Gist options
  • Select an option

  • Save andersio/5eaef64adccc4af9f687abc8894cc5de to your computer and use it in GitHub Desktop.

Select an option

Save andersio/5eaef64adccc4af9f687abc8894cc5de to your computer and use it in GitHub Desktop.
import XCTest
import ReactiveSwift
import Result
class PerformanceTests: XCTestCase {
let iterations = 50_000
func testStackBlowing() {
func nest(_ signal: Signal<(), NoError>) -> Signal<(), NoError> {
let (never, o) = type(of: signal).pipe()
defer { o.send(value: ()) }
return Signal.combineLatest(never, never, never, never, never, never, never, never, never, signal).map { $0.9 }
}
var (signal, observer) = Signal<(), NoError>.pipe()
var itr = 0
repeat {
signal = nest(signal)
observer.send(value: ())
itr += 1
if itr % 50 == 0 {
print(itr)
}
} while itr < 10000
}
func testCombineSignalTenary() {
let (s1, o1) = Signal<Int, NoError>.pipe()
let (s2, o2) = Signal<Int, NoError>.pipe()
let (s3, o3) = Signal<Int, NoError>.pipe()
let combined = Signal.combineLatest(s1, s2, s3)
o1.send(value: 0)
o2.send(value: 1)
o3.send(value: 2)
combined.observeValues { _ in }
measure {
for i in 0 ..< self.iterations {
o1.send(value: i)
o2.send(value: i + 1)
o3.send(value: i + 2)
}
}
}
func testCombineProducerTernary() {
let (s1, o1) = Signal<Int, NoError>.pipe()
let (s2, o2) = Signal<Int, NoError>.pipe()
let (s3, o3) = Signal<Int, NoError>.pipe()
let combined = SignalProducer.combineLatest(SignalProducer(s1), SignalProducer(s2), SignalProducer(s3))
o1.send(value: 0)
o2.send(value: 1)
o3.send(value: 2)
combined.startWithValues { _ in }
measure {
for i in 0 ..< self.iterations {
o1.send(value: i)
o2.send(value: i + 1)
o3.send(value: i + 2)
}
}
}
func testCombineSignal6ary() {
let (s1, o1) = Signal<Int, NoError>.pipe()
let (s2, o2) = Signal<Int, NoError>.pipe()
let (s3, o3) = Signal<Int, NoError>.pipe()
let (s4, o4) = Signal<Int, NoError>.pipe()
let (s5, o5) = Signal<Int, NoError>.pipe()
let (s6, o6) = Signal<Int, NoError>.pipe()
let combined = Signal.combineLatest(s1, s2, s3, s4, s5, s6)
o1.send(value: 0)
o2.send(value: 1)
o3.send(value: 2)
o1.send(value: 3)
o2.send(value: 4)
o3.send(value: 5)
combined.observeValues { _ in }
measure {
for i in 0 ..< self.iterations {
o1.send(value: i)
o2.send(value: i + 1)
o3.send(value: i + 2)
o4.send(value: i + 3)
o5.send(value: i + 4)
o6.send(value: i + 5)
}
}
}
func testCombineProducer6ary() {
let (s1, o1) = Signal<Int, NoError>.pipe()
let (s2, o2) = Signal<Int, NoError>.pipe()
let (s3, o3) = Signal<Int, NoError>.pipe()
let (s4, o4) = Signal<Int, NoError>.pipe()
let (s5, o5) = Signal<Int, NoError>.pipe()
let (s6, o6) = Signal<Int, NoError>.pipe()
let combined = SignalProducer.combineLatest(SignalProducer(s1), SignalProducer(s2), SignalProducer(s3),
SignalProducer(s4), SignalProducer(s5), SignalProducer(s6))
o1.send(value: 0)
o2.send(value: 1)
o3.send(value: 2)
o4.send(value: 3)
o5.send(value: 4)
o6.send(value: 5)
combined.startWithValues { _ in }
measure {
for i in 0 ..< self.iterations {
o1.send(value: i)
o2.send(value: i + 1)
o3.send(value: i + 2)
o4.send(value: i + 3)
o5.send(value: i + 4)
o6.send(value: i + 5)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment