For your example ARC makes a gigantic difference. (I put your global code in a 
main proc)
    
    
    import times
    
    type FooBase = ref object {.inheritable.}
      dummy: int
    
    type Foo{.final.} = ref object of FooBase
      value : float32
    
    proc inplace_add_proc(x: var Foo, a: float32) =
      x.value += a
    
    proc inplace_add_closure(x: var float32, a: float32) =
      proc add_closure(v: var float32) = v += a
      add_closure(x)
    
    method inplace_add_method(x: FooBase, a: float32) {.base.} =
      discard
    
    method inplace_add_method(x: Foo, a: float32) =
      x.value += a
    
    proc main =
      
      var bar : Foo
      new bar
      var start = cpuTime()
      for i in 0..<100000000:
        inplace_add_proc(bar, 1.0f)
      echo " Proc with ref object ", cpuTime() - start
      
      var x : float32
      start = cpuTime()
      for i in 0..<100000000:
        inplace_add_closure(x, 1.0f)
      echo " Closures ", cpuTime() - start
      
      var baz : Foo
      new baz
      start = cpuTime()
      for i in 0..<100000000:
        inplace_add_method(baz, 1.0f)
      echo " Methods ", cpuTime() - start
    
    main()
    
    
    Run
    
    
    $ nim c -r -d:danger t3.nim
     Proc with ref object 0.117909274
     Closures 1.719076293
     Methods 0.2647902979999999
    
    
    Run
    
    
    $ nim c -r -d:danger --gc:arc t3.nim
     Proc with ref object 0.118106775
     Closures 0.9414397170000001
     Methods 3.822302076
    
    
    Run

Reply via email to