Code reduktion



  • Hi,
    folgendes:
    Zeitmessung für 3 banale Summen Methoden:

    - "normal" e.g. int func(int n)
    - "inline"
    - "rekursiv"

    meine main sind wie folgt aus:

    #include <iostream>
    #include "Testklasse.h"
    #include <time.h>
    using namespace std;
    
    int main ()
    {
    	Testklasse Test;
    
    	double time1=0.0, tstart; 
    	cout << "Anzahl Loops: ";
    	double anz;
    	cin >> anz;
    	tstart = clock();               
    	for (int i = 0; i <=anz ; i++)
    	{
    		Test.normMeth(2) ;
    	}
    	time1 += clock() - tstart;     
    	time1 = time1/CLOCKS_PER_SEC;  
    	cout << "  time normMeth= " << time1 << " sec." << endl;
    
    	time1=0.0;
    	tstart = clock();
    	for (int i = 0; i <=anz ; i++)
    	{	
    		Test.rekMeth(2,2) ;
    	}
    	time2 += clock() - tstart;     
    	time2 = time2/CLOCKS_PER_SEC;
    	cout << "  time  rekMeth= " << time1 << " sec." << endl;
    
    	time1=0.0;	
    	tstart = clock();
    	for (int i = 0; i <=anz ; i++)
    	{
    		Test.inlMeth(2) ;
    	}
    	time3 += clock() - tstart;     
    	time3 = time3/CLOCKS_PER_SEC;
    	cout << "  time  inlMeth= " << time1 << " sec." << endl;
    	cin.sync();
    	cin.get();
    	return 0;
    }
    

    Problem: wie reduziert man den Code sodass am Ende vielleicht nur eine for-schleife steht?
    Ist doch minimierbar oder?

    danke für die Antworten👍



  • Ich glaube nicht das man es in eine for-Schleifen schreiben kann da du 3 unterschiedliche routinen n-Mal ausführen willst. Wenn du also später ein unverfälschtes Ergebnis der drei Funktionen erhalten willst müssen diese auch unabhängig, sprich nicht in einer Schleife, ausgeführt werden.

    Lg Tobi



  • Als erstes solltest du eine einheitliche Funktionsschnittstelle finden, um die drei spezifischen Funktionen dann generisch ansprechen zu können.

    void TestRoutine1(TestKlasse& Test)
    {
       Test.normMeth(2);
    }
    

    Anschliessend erstellst du eine weitere Funktion, welche einen Zeiger auf die jeweilige Testroutine als Parameter erhält.

    void MesseZeit(Testklasse& Objekt, void (*TestRoutine)(Testklasse&))
    {
        time1=0.0;
        tstart = clock();
        for (int i = 0; i <=anz ; i++)
        {    
            TestRoutine(Objekt);
        }
        time2 += clock() - tstart;     
        time2 = time2/CLOCKS_PER_SEC;
        cout << "  time  rekMeth= " << time1 << " sec." << endl;
    }
    

    Dann rufst du diese jeweils auf:

    Testklasse MeinTestObjekt;
    MesseZeit(MeinTestObjekt, &TestRoutine1);
    


  • oder direkt memberpointer 😉

    void (testklasse::*memper)(int val) = &testklasse::func1;
    
    testklasse t;
    t.*memptr(1);
    


  • hallo,

    erstmal danke für die Antworten.
    hört sich alles sehr interessant an. 😃 Bin leider etwas überfordert.
    Testklasse.h

    #pragma once
    
    class Testklasse
    {
    public:
    	Testklasse(void);
    	~Testklasse(void);
    	int normMeth(int n);
    	inline int inlMeth(int n)
    	{
    		return n+n;
    	}
    	int rekMeth(int n, int times);
    
    };
    

    Testklasse.cpp

    #include "Testklasse.h"
    //using namespace std;
    
    Testklasse::Testklasse(void)
    {
    }
    
    Testklasse::~Testklasse(void)
    {
    }
    
    int Testklasse::normMeth(int n)
    {
    	return n+n;
    }
    
    int Testklasse::rekMeth(int n, int times)
        {
          if(times==0) return 0;
    	  else
          return n + rekMeth(n,times-1);
        }
    

    und main.cpp ist im ersten Post zu sehen.

    Was kommt nun wo rein? 😞



  • Warum willst du das eigtl testen?
    Interessiert dich nur, was rauskommt?
    Oder willst du in deinem Projekt nur das schnellste nehmen?
    Oder oder oder^^

    bb



  • pampy schrieb:

    Bin leider etwas überfordert. [...] Was kommt nun wo rein? 😞

    Ich habe doch in meinem Post relativ genau erklärt, was du tun musst. Wenn du etwas davon nicht verstehst, dann frage bitte noch einmal konkret nach. Ich möchte nämlich nicht noch einmal alles erklären, nur um dann wieder die gleiche Antwort zu erhalten.



  • Hallo pampy,

    meinst Du sowas

    #include <iostream>
    #include "Testklasse.h"
    #include <ctime>
    #include <boost/bind.hpp>
    using namespace std;
    
    template< typename F >
    void benchmark( F func, int anz, const char* txt )
    {
        double tstart = clock();              
        for (int i = 0; i <=anz ; i++)
        {
            func();
        }
        double time1 = clock() - tstart;    
        time1 /= CLOCKS_PER_SEC;  
        cout << "  time " << txt << "= " << time1 << " sec." << endl;
    }
    
    int main ()
    {
        Testklasse Test;
    
        cout << "Anzahl Loops: ";
        int anz;
        cin >> anz;
    
        benchmark( boost::bind( &Testklasse::normMeth, &Test, 2 ), anz, "normMeth" );
        benchmark( boost::bind( &Testklasse::rekMeth, &Test, 2, 2 ), anz, " rekMeth" );
        benchmark( boost::bind( &Testklasse::inlMeth, &Test, 2 ), anz, " inlMeth" );
        cin.sync();
        cin.get();
        return 0;
    }
    


  • Hallo Werner_logoff,
    exakt.
    Also templates.. wird noch im Semester durchgenommen.

    danke für deine Antwort... werde es mal zuhause testen. 😃



  • was macht cin.sync() gleich nochmal?



  • volkard schrieb:

    was macht cin.sync() gleich nochmal?

    http://www.cplusplus.com/reference/iostream/istream/sync/
    ?



  • drakon schrieb:

    volkard schrieb:

    was macht cin.sync() gleich nochmal?

    http://www.cplusplus.com/reference/iostream/istream/sync/
    ?

    wo ist dann der unterschied zwischen
    stream.ignore( stream.rdbuf()->in_avail() );
    und
    stream.sync();
    ?

    bb


Log in to reply