Code automatisch anhand von Werten erstellen lassen?



  • Hallo zusammen,
    ich habe einen Code der sehr zeitkritisch ist. Dieser Code lädt normalerweise eine Datei mit Parametern, anhand derer er bestimmen kann wie oft welche Schleifen durchlaufen werden, wann Sprünge kommen usw.

    Da diese Werte schon zur Compilerzeit bereitstehen habe ich mir gedacht, dass man die dem Compiler auch zur Verfügung stellen sollte, damit dieser den Code entsprechend optimieren kann.

    Das Problem, ist, dass es mehrere verschachtelte Schleifen sind z.B.

    for(i = 0; i < 5; ++i){
       innereSchleife = ladeParameter(i);
       for(l = 0; l < innereSchleife ; ++l){
         macheIrgendwas();
       }
    }
    

    In der Datei würde dann z.B. stehen:

    3
    4
    6

    Also könnte der Compiler eigentlich das ganze ja so machen:

    for(i = 0; i < 5; ++i){
       for(l = 0; l < 3; ++l){
         macheIrgendwas();
       }
       for(l = 0; l < 4; ++l){
         macheIrgendwas();
       }
       for(l = 0; l < 6; ++l){
         macheIrgendwas();
       }
    }
    

    Also was macht da? Ich will das natürlich nicht von Hand machen, denn es sind tausende Zeilen Code und die Parameter ändern sich alle paar Tage.

    Gruß
    wdsl



  • Dateizugriffe sind relativ langsam, also würde ich an Deiner Stelle vor Ausführung der ersten Schleife bereits alle Daten, die anschließend benötigt werden, in den RAM laden. Der Geschwindigkeitsnachteil gegenüber deiner zweiten Version sollte dann nicht besonders groß sein, dafür bleibst Du flexibel und zerhackst Dir Dein Programm nicht.
    Ich würde an Deiner Stelle zunächst eine kleine Funktion aus deinem Programm einzeln benchmarken, optimieren und versuchen einen Kompromiss zwischen Geschwindigkeit und schönem Code zu finden.

    Du könntest zB Deinen Codeteil (wieso eigentlich i<5?):

    for(i = 0; i < 5; ++i){
       for(l = 0; l < 3; ++l){
         macheIrgendwas();
       }
       for(l = 0; l < 4; ++l){
         macheIrgendwas();
       }
       for(l = 0; l < 6; ++l){
         macheIrgendwas();
       }
    }
    

    mal gegen diesen hier laufen lassen. Ich kann mir nicht vorstellen, dass sich das viel tut:

    int runs[] = { 3, 4, 6 };
    for (i = 0; i < 3; ++i)
    {
      for (l = 0; l < runs[i]; ++l)
        macheIrgendwas();
    }
    

  • Mod

    Eigentlich dürfte das sogar überhaupt keinen Unterschied machen, außer für sehr kleine Durchlaufzahlen(wo der Optimierer die Schleife abrollen könnte). Ob der Vergleichswert für die Schleife nämlich aus dem Datensegment des Programms oder einer Variable genommen wird, ändert nichts.

    Falls du dies trotzdem machen willst (wozu ich dir nicht rate): Der Präprozessor ist viel mächtiger als man so denkt. Mittels include kannst du Datendateien vor dem compilieren "laden". Mit ein bisschen Trickserei kannst du dann den gewünschten Effekt erzielen. Schau dir boost:preprocessor an, wenn du nicht alles selbst programmieren möchtest.


Log in to reply