diff --git a/bench/linked.nim b/bench/linked.nim new file mode 100644 index 0000000..a3095ba --- /dev/null +++ b/bench/linked.nim @@ -0,0 +1,184 @@ +import times +import stats +import random +import strformat + +import ../src/nimdeque + + +when isMainModule: + const benchSize = 500000 + echo &"\nRunning benchmarks with queue size of {benchSize} against a seq" + var q = newLinkedDeque[int]() + var q2: seq[int] = @[] + var t: seq[float] = @[] + var tmp: float + var st: RunningStat + var benchStart = cpuTime() + var start = cpuTime() + + echo &" Benchmarking LinkedDeque.add()" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + q.add(i) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo &" Benchmarking seq.add()" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + q2.add(i) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo &" Benchmarking LinkedDeque.pop(0)" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + discard q.pop() + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo &" Benchmarking seq.delete(0)" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + q2.delete(0) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + q2 = @[] + echo &" Benchmarking LinkedDeque.addLeft()" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + q.addLeft(i) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo &" Benchmarking seq.insert(0)" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + q2.insert(i, 0) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo " Benchmarking random access for LinkedDeque (10000 times)" + for i in countup(0, 10000): + tmp = cpuTime() + discard q[rand(benchSize - 1)] + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo " Benchmarking random access for seq (10000 times)" + for i in countup(0, 10000): + tmp = cpuTime() + discard q2[rand(benchSize - 1)] + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + t = @[] + start = cpuTime() + echo &" Benchmarking LinkedDeque.pop(^1)" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + discard q.pop(^1) + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + echo &" Benchmarking seq.pop()" + for i in countup(0, benchSize - 1): + tmp = cpuTime() + discard q2.pop() + t.add(cpuTime() - tmp) + st.push(t) + echo &""" + - Done in {cpuTime() - start} seconds. Results (in seconds): + - min: {st.min} + - max: {st.max} + - avg: {st.mean()} + - stdev: {st.standardDeviation()}""" + + st.clear() + t = @[] + start = cpuTime() + q2 = @[] + + echo &"\nTotal benchmark time: {cpuTime() - benchStart}" diff --git a/tests/linked.nim b/tests/linked.nim index 31f4c1d..1fe9a58 100644 --- a/tests/linked.nim +++ b/tests/linked.nim @@ -158,181 +158,4 @@ when isMainModule: doAssert deque.find(0) == 0 doAssert deque.find(size) == -1 doAssert deque.find(size div 2) == size div 2 - echo &"Tests completed in {cpuTime() - testStart} seconds" - - ## End of tests, start of benchmark - echo &"\nRunning benchmarks with queue size of {benchSize} against a seq" - var q = newLinkedDeque[int]() - var q2: seq[int] = @[] - var t: seq[float] = @[] - var tmp: float - var st: RunningStat - var benchStart = cpuTime() - var start = cpuTime() - - echo &" Benchmarking LinkedDeque.add()" - for i in countup(0, benchSize - 1): - tmp = cpuTime() - q.add(i) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo &" Benchmarking seq.add()" - for i in countup(0, benchSize - 1): - tmp = cpuTime() - q2.add(i) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo &" Benchmarking LinkedDeque.pop(0)" - for i in countup(0, size * 10 - 1): - tmp = cpuTime() - discard q.pop() - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo &" Benchmarking seq.delete(0)" - for i in countup(0, size * 10 - 1): - tmp = cpuTime() - q2.delete(0) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - q2 = @[] - echo &" Benchmarking LinkedDeque.addLeft()" - for i in countup(0, benchSize - 1): - tmp = cpuTime() - q.addLeft(i) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo &" Benchmarking seq.insert(0)" - for i in countup(0, benchSize - 1): - tmp = cpuTime() - q2.insert(i, 0) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo " Benchmarking random access for LinkedDeque (10000 times)" - for i in countup(0, 10000): - tmp = cpuTime() - discard q[rand(benchSize - 1)] - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo " Benchmarking random access for seq (10000 times)" - for i in countup(0, 10000): - tmp = cpuTime() - discard q2[rand(benchSize - 1)] - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - t = @[] - start = cpuTime() - echo &" Benchmarking LinkedDeque.pop(^1)" - for i in countup(0, size * 10 - 1): - tmp = cpuTime() - discard q.pop(^1) - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - echo &" Benchmarking seq.pop()" - for i in countup(0, size * 10 - 1): - tmp = cpuTime() - discard q2.pop() - t.add(cpuTime() - tmp) - st.push(t) - echo &""" - - Done in {cpuTime() - start} seconds. Results (in seconds): - - min: {st.min} - - max: {st.max} - - avg: {st.mean()} - - stdev: {st.standardDeviation()}""" - - st.clear() - t = @[] - start = cpuTime() - q2 = @[] - - echo &"\nTotal benchmark time: {cpuTime() - benchStart}" - echo &"Total execution time: {cpuTime() - testStart}" \ No newline at end of file + echo &"Tests completed in {cpuTime() - testStart} seconds" \ No newline at end of file