C++ Benchmarker gesucht



  • Hallo,
    da ich im Moment mal wieder mit CORBA arbeite, habe ich häufig Code der so aussieht:

    void func()
    {
       try
       {
           remoteOp();
       }
       catch(const CORBA::SystemException&)
       {
           throw LokaleConnectionException();
       }
       catch(const CORBA::Bla&)
       {
           throw LokaleBlaException();
       }
       catch(const CORBA::Blub&)
       {
           throw LokaleBlubException();
       }
       // ...
       catch(const CORBA::UserException&)
       {
           throw LokaleUnbekannteException();
       }
    }
    

    Das ist auf die Dauer natürlich ziemlich hässlich, habe ich nach Alternativen gesucht. Spontan fallen mir da Makros (derzeitige Lösung) und Templates ein.

    Ein entsprechendes Template (brutal reduziert) könnte etwa so aussehen:

    #include <loki/typelist.h>  // deshalb habe ich nicht in ISO-C++ gepostet
    
    template <class TList> 
    struct OpCaller
    {
    public:
    	typedef typename TList::Head head;
    	typedef typename TList::Tail tail;
    	void operator() (void (*func)())
    	{
    		try
    		{
    			OpCaller<tail>()(func);
    		}
    		catch(const head& e)
    		{
    			(void)e;
    			cout << "Gefangen " << typeid(e).name() << endl;
    		}
    	}
    };
    
    template <>
    struct OpCaller<Loki::NullType>
    {
    	void operator() (void (*func)())
    	{
    		func();
    	}
    };
    
    class Exception1 {};
    class Exception2 : public Exception1 {};
    void func()
    {
    	if (rand() % 2)
    	{
    		cout << "Werfe Exception1" << endl;
    		throw Exception1();
    	}
    	cout << "Werfe Exception2" << endl;
    	throw Exception2();
    
    }
    int main()
    {
    	srand(time(0));
    	for (int i = 0; i < 5; ++i)
    	{
    		OpCaller<TYPELIST_2(Exception1, Exception2)> op;
    		op(func);
    	}
    }
    

    In der richtigen Version hätte OpCaller natürlich ein paar mehr Templateparameter (u.A. einen für die Exceptionbehandlungsroutine), ein paar Überladungen für den op() und außerdem müsste die Typelist noch soriert werden.

    Ich frage mich nun allerdings wie performant dieser Ansatz ist, sprich ob die try-catch-Blöcke nicht das wegoptimieren der forwarder verhindern. Beim VC 6 scheint das zumindest der Fall zu sein.

    Hat jemand Lust und Zeit das mal auf seinem Lieblingscompiler nachzumessen? Also wie verhält sich die Templateversion im Normalfall (keine Exception) im Gegensatz zur explizit ausgeschriebenen Variante.

    Ich freue mich natürlich auch über Alternativvorschläge.


Anmelden zum Antworten