''(From TestTypesInsteadOfDispatch)'' Before we jump to any conclusions about the results of this code, we need Sunir to come verify that it is a fair test. ''It isn't. I'll have to carve out some time to demonstrate what I mean, but that isn't likely to happen while I have a deadline next week ;) --ss'' ---- '''In dispatch.cpp:''' #include #include class Timeable { public: clock_t run() { clock_t start = ::clock(); for (int i = 0; i < 5000000; i++) reallyRun(); // (Template pattern) clock_t end = ::clock(); return end - start; } virtual void reallyRun() = 0; }; class N''''''ormalDispatchTimer: public Timeable { public: class N''''''ormalClass { public: virtual void run() = 0; }; // It would probably work with just one derived class, but just in case... class F''''''irstNormalClass: public N''''''ormalClass { public: void run() { /* */ } }; class S''''''econdNormalClass: public N''''''ormalClass { public: void run() { /* */ } }; void reallyRun() { first.run(); second.run(); } private: F''''''irstNormalClass first; S''''''econdNormalClass second; }; class M''''''anualDispatchTimer: public Timeable { public: void reallyRun() { runOn(&first); runOn(&second); } class M''''''anualClass { public: enum TYPE { F''''''irstType, S''''''econdType, }; unsigned char type; }; class F''''''irstManualClass: public M''''''anualClass { public: F''''''irstManualClass(): type(F''''''irstType) { } unsigned char type; int someData; }; class S''''''econdManualClass: public M''''''anualClass { public: S''''''econdManualClass(): type(S''''''econdType) { } unsigned char type; int someOtherData; }; inline void runOn(M''''''anualClass* mcp) { int x; if (M''''''anualClass::F''''''irstType == mcp->type) x = ((F''''''irstManualClass*)mcp)->someData; else if (M''''''anualClass::S''''''econdType == mcp->type) x = ((S''''''econdManualClass*)mcp)->someOtherData; } private: F''''''irstManualClass first; S''''''econdManualClass second; }; int main() { std::cout << "Normal: " << N''''''ormalDispatchTimer().run() << std::endl << "Manual: " << M''''''anualDispatchTimer().run() << std::endl; } ---- '''In the Makefile:''' default: plain optimized ./plain ./optimized plain: *.cpp g++ $< -o plain optimized: *.cpp g++ -O3 $< -o optimized