nim
import sequtils, threadpool, times, strutils
template time(statement: untyped): float =
let t0 = cpuTime()
statement
cpuTime() - t0
proc splitToTerms(n:int, k:int): seq[seq[int]] =
var kk = k
if kk == 0: kk = n
if n == 0:
return newSeq[seq[int]]()
result = newSeq[seq[int]]()
if n <= kk:
result.add(@[n])
for i in 1 .. min(n, kk):
for l in splitToTerms(n-i, i):
result.add(l&(@[i]))
var res1: seq[int]
var res2: seq[int]
proc nonthreaded(n:int) =
for i in 1 .. n:
res1.add len(splitToTerms(n,i))
proc threaded(n:int) =
for i in 1 .. n:
let rs = spawn splitToTerms(n,i)
res2.add len(^rs)
let n=50
assert res1 == res2
let t1 = time(nonthreaded(n)).formatFloat(ffDecimal, precision = 3)
echo "Time nonthreaded = ", t1, " s"
echo res1
let t2 = time(threaded(n)).formatFloat(ffDecimal, precision = 3)
echo "Time threaded = ", t2, " s"
echo res2
Run
t1 = 11.86s, t2 = 0.982s for me. But! Before echo res2 is output to console i
wait for ~11-12s, after t1 is outputed. WHY?