$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Andreas Huber (ahd6974-spamgroupstrap_at_[hidden])
Date: 2005-08-24 16:19:22
Hi Dick
BRIDGES Dick wrote:
> When compiling the examples (statechart library downloaded from sf 18
> Aug),
> I get the following warnings:
[snip warnings]
> I changed ~simple_State() and ~state_base() to virtual and the
> warnings disappeared. However, ~state_base() contains the following
> annotation:
>
> // This destructor is not virtual for performance reasons. The library
> // ensures that a state object is never deleted through a state_base
> // pointer but only through a pointer to the most-derived type.
> ~state_base() {}
>
> As a quick, not-definitive check, I built PingPong* with both the
> virtual
> and non-virtual dtorS using gcc 3.4.2 on an old i386-redhat-linux
> machine.
I would expect the PingPong examples to deliver the least-dependable
information regarding virtual vs. non-virtual dtors. This is due to the
fact that a lot of stuff is going on besides the destruction of states.
I think BitMachine would make for a better testing platform...
> The results appear to be the reverse of what I would expect, but I
> checked
> to verify that I have the correct result/config correspendence.
>
> ..................non-virtual.....virtual
> PingPongSingle.... 4.08 ..... 3.71
> PingPongMulti1.... 6.01997 ..... 5.85999
> PingPongMulti2.... 19.53 ..... 19.55
Hmmm, here's what I get on a 3.2GHz Intel Pentium 4 Windows XP machine
(all numbers in microseconds non-virtual / virtual):
*** MSVC7.1 ***
PingPongSingle: 1.06 / 1.07
PingPongMulti1: 5.41 / 5.43
PingPongMulti2: 12.34 / 12.26
BitMachineCustom3: 0.18 / 0.19
*** GCC 3.4.2 (MinGW) ***
PingPongSingle: 1.27 / 1.27
PingPongMulti1: 6.03 / 6.11
PingPongMulti2: 13.20 / 13.27
BitMachineCustom3: 0.32 / 0.30
*** Intel 9.0 ***
PingPongSingle: 1.14 / 1.14
PingPongMulti1: 5.38 / 5.43
PingPongMulti2: 12.27 / 12.35
BitMachineCustom3: 0.16 / 0.16
I.e. no significant difference non-virtual vs. virtual. Two things come
to mind:
1. At the point where states are destructed (see simple_state.hpp, line
983) the compiler might know that the type of the pointer matches the
runtime type of the referenced object and therefore call the virtual
destructor non-virtually. However, I'm not sure whether such compiler
magic is implemented in any of the tested platforms nor do I have a clue
whether that's possible at all (it does sound pretty impossible)
2. There could be little difference on modern processors anyway (as you
have mentioned)
> Reminds me of the old joke: "I see fine. I just don't understand
> what
> I'm looking at." Two questions: 1) will making the dtorS virtual
> lead
> to adverse consequences I simply haven't encountered yet;
Given the numbers above I don't see any problems whatsoever. Not on the
tested processors, that is. I can't say whether the picture is the same
for processors used in the embedded world.
> and 2) can
> someone help me understand what I did wrong in setting up this test?
Difficult to say. Could you build with bjam and repeat the test?
> <extra_credit ot=true my_understanding=faulty>
:-), my understanding is non-existent in this area...
> With a well-developed pipelined architecture and a reasonably rich set
> of addressing operations, shouldn't there be little or no difference
> between direct and indirect access times - given that the bookeeping
> normally associated with virtual classes has already been paid for?
> </extra_credit>
I think my numbers make some limited sense. I don't see how the virtual
dtor version could actually be faster as your numbers suggest.
Regards,
-- Andreas Huber When replying by private email, please remove the words spam and trap from the address shown in the header.