On 23/03/07 11:10 AM, Ernie Rael wrote:
> On 23/03/07 9:14 AM, Bram Moolenaar wrote:
>> Ernie Rael wrote:
>>
>>>
>>> I was surprised to see a user function ~1,000 times slower.
>> Invoking a user function has a lot of overhead. You did use a compiled
>> function?
> I did. But I was uncomfortable with the results; finally this morning
> it occurred to me that I wasn't using the profiler correctly for micro
> benchmarking and I'm looking at that right now. I don't believe the
> function is 1,000 slower, maybe more like 100 times slower.
My hand slapping against my forehead...
Turns out the main performance issue is that I was running the test by
doing "source %" in a gvim that had been running for a while.
PutIfAbsent(), run from gvim that's been running for a long time, can be
around 12x slower than than when run from the command line as "gvim -c
'source test.vim' -c q". Alloc/free?
And curiously, when run from the command line, gvim is 50% slower than
vim. Some results below, the "command line" results are repeatable.
Doing ":source" in a just started gvim, versus command line gvim, is
~20% faster, I'm guessing that's because gvim has time to get to a
quiescent state before the test is run.
Note that only the user function implementation (which takes much longer
than anything else) shows such a huge variation in performance. The
bottom line is that the user function PutIfAbsent is ~30 times slower
than extend({[k]: v}, 'keep') when run with vim from command line.
-ernie
Using running for a while gvim, :sou %
10 30 65 100 200 300 : nKeys
(micro-sec/algorithm)
293 308 305 311 318 323 :
d->PutIfAbsent(k, v)
0.468 0.448 0.465 0.484 0.467 0.488 :
d->extend({[k]: v}, 'keep')
Using gvim from command line
$ gvim -c 'source test.vim' -c q
1.276 5.895 10.580 15.006 19.510 24.190 :
d->PutIfAbsent(k, v)
0.479 0.476 0.473 0.464 0.477 0.493 :
d->extend({[k]: v}, 'keep')
Using console vim from command line
$ vim -c 'source test.vim' -c q
0.974 4.223 7.227 10.401 13.967 16.784 :
d->PutIfAbsent(k, v)
0.478 0.476 0.464 0.469 0.471 0.491 :
d->extend({[k]: v}, 'keep')
Using fresh start gvim, :sou
1.038 4.948 8.836 12.581 16.383 20.328 :
d->PutIfAbsent(k, v)
0.477 0.470 0.454 0.455 0.456 0.491 :