I was doing some testing, comparing Nim and Rust for some string operations, 
and I somehow managed to cut Nim's runtime in half by adding a call to my 
reverse function outside of the loop.
    
    
    proc reverse(s: string): string =
      result = s
      
      let size = s.len
      for (i, c) in s.pairs():
        result[(size - i - 1)] = c
    
    proc main() =
      let s = "Hello world"
      
      when defined(faster):
        discard reverse(s)
      
      for i in 1..200_000_000:
        let _ = s.reverse()
    
    
    when isMainModule:
      main()
    
    
    Run

Rust:
    
    
    $ time ./target/release/str_reverse
    
    real        0m10.385s
    user        0m10.362s
    sys 0m0.019s
    
    
    Run

Nim:
    
    
    $ nim c -d:release src/str_reverse.nim
    $ time src/str_reverse
    
    real  0m11.957s
    user  0m11.777s
    sys   0m0.049s
    
    
    Run

Nim with my custom flag:
    
    
    $ nim c -d:release -d:faster src/str_reverse.nim
    $ time src/str_reverse
    
    real  0m6.325s
    user  0m6.145s
    sys   0m0.050s
    
    
    Run

Could someone explain why the speedup is occurring? Thanks! 

Reply via email to