digitalmars.D - benchmark dict list and string, D vs python vs lua
- lzzll (58/58) Apr 05 2012 Hey, I wrote some code to benchmark dict list and string in D,
- Andrej Mitrovic (34/36) Apr 05 2012 Tables to the rescue:
- Andrei Alexandrescu (31/37) Apr 05 2012 [snip]
Hey, I wrote some code to benchmark dict list and string in D, python and lua. D is a great language, but some library look comparatively slow. Some where may be wrong, I start D just today. D test: code: http://pastebin.com/qF7N4wLx dict set: 2.251s dict get: 1.957s dict cleat: 0.00s list set: 0.085s list get: 0.007s list each: 0.014s str find: 1.254s str replace: 1.870s Python test: code: http://pastebin.com/m3qMjPcM dict set: 1.05s dict get: 0.75s dict cleat: 0.11s list set: 0.02s list get: 0.09s list each: 0.09s str find: 0.94s str replace: 0.67s Lua test: code: http://pastebin.com/TFTnsWzX dict set: 2.11s dict get: 0.87s dict cleat: 0.19s list set: 0.33s list get: 0.03s list each: 0.09s str find: 0.94s str replace: 1.10s Compare (> mean faster than): dict set: python > lua > D dict get: python > lua > D dict clear: D > lua > python list set: python > D > lua list get: D > lua > python list each: D > lua = python str find: python = lua > D str replace: python > lua > D C algorithm (with -O3): map tree set: 0.70s map tree get: 0.39s map tree clear: 0.23 chain set: 0.09s chain get: too large ... chain each: 0.05s variable length list set: 0.025s variable length list get: 0.01s variable length list each: 0.01s quick search find: 0.29s remalloc replace: 0.40s chain replace: 0.40s I think the one of problems is to!string(int) too slow, snprintf will better.
Apr 05 2012
On 4/5/12, lzzll <ownrepos gmail.com> wrote:I think the one of problems is to!string(int) too slow, snprintf will better.Tables to the rescue: __gshared string[int] table; shared static this() { foreach (i; 0 .. MAX_RANGE) table[i] = to!string(i); } Then use table[i] instead of to!string(i). Here's a comparison: to!string: ---- test_dict ----- test dict set (1000000)... 1.281s test dict get (1000000)... 1.047s test dict clear (1000000)... 0.000s ---- test_list ----- test list set (1000000)... 0.125s test list get (1000000)... 0.000s test list each (1000000)... 0.000s ---- test_str ----- test str find (1000000)... 0.703s test str replace (1000000)... 1.016s table (http://pastebin.com/43Z4EwMj) test dict set (1000000)... 0.891s test dict get (1000000)... 0.109s test dict clear (1000000)... 0.000s ---- test_list ----- test list set (1000000)... 0.078s test list get (1000000)... 0.000s test list each (1000000)... 0.000s ---- test_str ----- test str find (1000000)... 0.125s test str replace (1000000)... 1.203s But it seems the str replace test got slower even though all the other tests got faster.
Apr 05 2012
On 4/5/12 2:00 PM, lzzll wrote:Hey, I wrote some code to benchmark dict list and string in D, python and lua. D is a great language, but some library look comparatively slow. Some where may be wrong, I start D just today.[snip] Thanks for the benchmark, good comparisons are always helpful.I think the one of problems is to!string(int) too slow, snprintf will better.You're right. In fact I took a minute to adapt some C++ code I wrote for work into a faster to!string routine. On my machine I get: $ ./test.py ---- test_dict ----- test dict set (1000000)... 0.64s test dict get (1000000)... 0.40s test dict clear (1000000)... 0.09s ---- test_list ----- test list set (1000000)... 0.02s test list get (1000000)... 0.08s test list each (1000000)... 0.06s ---- test_str ----- test str find (1000000)... 0.47s test str replace (1000000)... 0.48s $ ./test ---- test_dict ----- test dict set (1000000)... 0.729s test dict get (1000000)... 0.261s test dict clear (1000000)... 0.000s ---- test_list ----- test list set (1000000)... 0.073s test list get (1000000)... 0.001s test list each (1000000)... 0.001s ---- test_str ----- test str find (1000000)... 0.593s test str replace (1000000)... 0.804s Not too shoddy! I'll work on adding the better conversion routine to Phobos. Andrei
Apr 05 2012