Test Types Instead Of Dispatch Profile Code

(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<iostream>
  #include<ctime>

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 NormalDispatchTimer: public Timeable { public: class NormalClass { public: virtual void run() = 0; };

// It would probably work with just one derived class, but just in case... class FirstNormalClass: public NormalClass { public: void run() { /* */ } };

class SecondNormalClass: public NormalClass { public: void run() { /* */ } };

void reallyRun() { first.run(); second.run(); }

private:

FirstNormalClass first; SecondNormalClass second; };

class ManualDispatchTimer: public Timeable { public: void reallyRun() { runOn(&first); runOn(&second); }

class ManualClass { public: enum TYPE { FirstType, SecondType, };

unsigned char type; };

class FirstManualClass: public ManualClass { public: FirstManualClass(): type(FirstType) { }

unsigned char type;

int someData; };

class SecondManualClass: public ManualClass { public: SecondManualClass(): type(SecondType) { }

unsigned char type;

int someOtherData; };

inline void runOn(ManualClass* mcp) { int x; if (ManualClass::FirstType == mcp->type) x = ((FirstManualClass*)mcp)->someData; else if (ManualClass::SecondType == mcp->type) x = ((SecondManualClass*)mcp)->someOtherData; }

private: FirstManualClass first; SecondManualClass second; };

int main() { std::cout << "Normal: " << NormalDispatchTimer().run() << std::endl << "Manual: " << ManualDispatchTimer().run() << std::endl; }


In the Makefile:

 default: plain optimized
    ./plain
    ./optimized

plain: *.cpp g++ $< -o plain

optimized: *.cpp g++ -O3 $< -o optimized


EditText of this page (last edited June 5, 2001) or FindPage with title or text search