-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Closed
Labels
Milestone
Description
by yury.shulaev:
I did a trivial map benchmark using Go (gc), JavaScript (V8) and Python (Python3, PyPy) and here are the results: $ export GOMAXPROCS=""; go build map.go; time ./map real 0m0.656s user 0m0.652s sys 0m0.000s $ time node map.js real 0m0.055s user 0m0.040s sys 0m0.012s $ time python3 map.py real 0m0.613s user 0m0.592s sys 0m0.016s $ time pypy map.py real 0m0.143s user 0m0.124s sys 0m0.016s Looks like Go's map is 12 times slower than V8's and 4.5 times slower than PyPy's. Well, JavaScript objects can only use strings as keys, but Python's dict does not have this limitation and it is still being able to run in 0.143s. Is it possible to adapt V8's map implementation to Go? By the way, it looks simpler: https://github.com/v8/v8/blob/master/src/hashmap.h vs http://code.google.com/p/go/source/browse/src/pkg/runtime/hashmap.c Code used in the benchmark: map.go: package main func main() { a := make(map[int]int) for i := 0; i < 10000000; i++ { a[123] = 456 } } map.js: function main() { var a = {}; for (var i = 0; i < 10000000; i++) { a[123] = 456; } } main(); map.py: #!/usr/bin/env python3 def main(): a = {} for i in range(10000000): a[123] = 456 if __name__ == '__main__': main() Profiler output for 10 times more iterations: Total: 772 samples 385 49.9% 49.9% 504 65.3% hash_lookup 106 13.7% 63.6% 106 13.7% runtime.memhash 86 11.1% 74.7% 86 11.1% runtime.rnd 60 7.8% 82.5% 618 80.1% runtime.mapaccess 37 4.8% 87.3% 37 4.8% runtime.memcopy32 33 4.3% 91.6% 765 99.1% main.main 32 4.1% 95.7% 732 94.8% runtime.mapaccess1 20 2.6% 98.3% 20 2.6% hash_indirect 13 1.7% 100.0% 13 1.7% runtime.memequal32 0 0.0% 100.0% 765 99.1% runtime.main OS and hardware: Linux 3.2.0-27-generic #43-Ubuntu SMP Fri Jul 6 14:25:57 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux go version go1 (which is 'apt-get install golang') Intel Core i5, 4 GB RAM