Instantly share code, notes, and snippets.

Embed
What would you like to do?
Minimal example to demonstrate performance difference between seq and array access
import times
template benchmark*(benchmarkName: string, code: untyped) =
block:
let timeStart = cpuTime()
code
echo benchmarkName
echo cpuTime() - timeStart, "s"
var seqBase = @[@[1, 2], @[322146413, 397146891], @[2100521352, 391739920], @[
330559900, 77684297], @[908332622, 428261606], @[1, 2], @[322146413,
397146891], @[2100521352, 391739920], @[
330559900, 77684297], @[908332622, 428261606]]
var arrayBase = @[[1, 2], [322146413, 397146891], [2100521352, 391739920], [
330559900, 77684297], [908332622, 428261606], [1, 2], [322146413,
397146891], [2100521352, 391739920], [
330559900, 77684297], [908332622, 428261606]]
var
someSeqOSeq = seqBase
someSeqOArray = arrayBase
const
nIter = 200
nCopy = 100
for i in 0..nCopy:
someSeqOSeq &= seqBase
someSeqOArray &= arrayBase
benchmark "Seq of Seq":
var count = 0
for x in 0..nIter:
for y in 0..nIter:
for s in someSeqOSeq:
let a = s[0]
let b = s[1]
if ((a + b) * 23) mod b == 0: count += 1
benchmark "Seq of Array":
var count = 0
for x in 0..nIter:
for y in 0..nIter:
for s in someSeqOArray:
let a = s[0]
let b = s[1]
if ((a + b) * 23) mod b == 0: count += 1
import times
template benchmark*(benchmarkName: string, code: untyped) =
block:
let timeStart = cpuTime()
code
echo benchmarkName
echo cpuTime() - timeStart, "s"
let someSeqOSeq = @[@[1, 2], @[322146413, 397146891], @[2100521352, 391739920], @[
330559900, 77684297], @[908332622, 428261606], @[1, 2], @[322146413,
397146891], @[2100521352, 391739920], @[
330559900, 77684297], @[908332622, 428261606]]
let someSeqOArray = @[[1, 2], [322146413, 397146891], [2100521352, 391739920], [
330559900, 77684297], [908332622, 428261606], [1, 2], [322146413,
397146891], [2100521352, 391739920], [
330559900, 77684297], [908332622, 428261606]]
const nIter = 1000
benchmark "Seq of Seq":
var count = 0
for x in 0..nIter:
for y in 0..nIter:
for s in someSeqOSeq:
let a = s[0]
let b = s[1]
if ((a + b) * 23) mod b == 0: count += 1
benchmark "Seq of Array":
var count = 0
for x in 0..nIter:
for y in 0..nIter:
for s in someSeqOArray:
let a = s[0]
let b = s[1]
if ((a + b) * 23) mod b == 0: count += 1
@technicallyagd

This comment has been minimized.

Owner

technicallyagd commented Dec 6, 2018

using compiler built from commit 9eaf99f7e61d07f5502b3656a255ea944c47f984.
Result of main.nim from my machine:

  • with -d:release:
Seq of Seq
0.45509076s
Seq of Array
0.1059315100000001s
  • without:
Seq of Seq
4.405831273s
Seq of Array
0.4498233489999999s

Result of longOuter.nim from my machine:

  • with -d:release:
Seq of Seq
1.941198598s
Seq of Array
0.3409378690000002s
  • without:
Seq of Seq
18.001304946s
Seq of Array
1.463049079000001s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment