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!