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? 

Reply via email to