On Thu, 12 Nov 2009 12:38:00 -0500, dsimcha <dsim...@yahoo.com> wrote:

== Quote from Steven Schveighoffer (schvei...@yahoo.com)'s article
 By far a direct call is faster, but I was surprised at how
little overhead virtual calls add in relation to the loop counter. I had
to use 10 billion loops or else the difference was undetectable.
I used dmd 1.046 -release -O (the -release is needed to get rid of the
class method checking the invariant every call).
The relative assembly for calling a virtual method is:
mov     ECX,[EBX]
mov     EAX,EBX
push    dword ptr -8[EBP]
call    dword ptr 014h[ECX]
and the assembly for calling a delegate is:
push    dword ptr -8[EBP]
mov     EAX,-010h[EBP]
call    EBX
-Steve

Your benchmarks don't show that the direct call is much faster. You had inlining disabled. Was this intentional? If so, it proves my point that most of the overhead from virtual calls comes from the fact that they can't usually be
inlined, not because they're virtual.

The direct call was 5 seconds faster. Divide by 10 billion and you get a small but present amount.

Inlining makes the struct member function call disappear (b/c foo does nothing!), so it's not really a relevant benchmark.

I did the "struct" version as a baseline. Consider that the struct version is the cost of doing the loop increments, pushing the 'this' pointer and argument, and calling the function. Any difference from that is the overhead of virtual/delegate/interface calls.

Inlining is not possible with delegates (yet), so it's not really important for this argument.

-Steve

Reply via email to