memcpy oder Zuweisungsoperator



  • Hallo!
    Ich hab vor einiger Zeit eine nette kleine UCI Schachengine geschrieben, die Bedenkzeit des Programms ist bis zur Suchtiefe 5 Halbzuege passabel (ca. 5 Sekunden im Schnitt), aber wenn ich 6 Halbzuege rechnen lassen will, werden ueber anderthalb Minuten benoetigt. Habe ursprünglich eigentlich nur den Alpha_Beta Algorithmus traineren wollen, aber jetzt hat mich das Schachprogrammier-Fieber gepackt und beim nächsten Versuch sollte das Programm zumindest 7 Halbzuege in der gleichen Zeit schaffen in der das alte Programm 5 geschafft hat. Das heißt natürlich, dass möglichst überall auf Geschwindigkeit optimierter Code benötigt wird. Sehr viele Tipps habe ich schon im Netz gefunden (Präfix statt Postfix verwenden, Bitschieben statt dividieren usw.).

    Meine momentane Frage:
    Zum Kopieren einer Struktur: ist da memcpy oder der Zuweisungsoperator besser geeignet? Oder ist das 'unter der Haube' ein und dieselbe Funktion?
    Und auch vielleicht einen Link zu einer Seite, auf der viele Optimierungstipps stehen, könnte mir gewaltig weiter helfen.
    Klarer Weise ist mit solchen 'Optimierungstricks' alleine wohl kaum ein Geschwindigkeitszuwachs um den Faktor 1600 zu erwarten, d'rum hab ich natürlich auch die Datenstrukturen und Algorithmen stark verändert (das ist ja mindestens genau so wichtig für die Performance wie die Tricks!), aber wie's aussieht gibt's eigentlich nix schnelleres als Alpha_Beta.

    Thx für jegliche Tipps rund um's Optimieren und auch speziell zum Schachprogrammieren!



  • for(int i = 0; i < em_aId; ++i){
    em_oldLoc = em_old_aStack[i]->location->index;					memcpy(em_aStack[i],em_old_aStack[i],pieceCopySize);
    em_quickBoard[em_oldLoc].inhab = em_aStack[i];
    em_aStack[i]->location = em_quickBoard + em_oldLoc;
    }			
    				memcpy(em_aStack[em_aId],em_old_aStack[em_aId],pieceCopySize);
    em_quickBoard[em_pLoc].inhab = em_aStack[em_aId];
    em_aStack[em_aId]->location = em_quickBoard+em_pLoc;
    
    for(int i = em_aId+1; i < em_aPieceCount; ++i){
    em_oldLoc = em_old_aStack[i]->location->index;
    memcpy(em_aStack[i],em_old_aStack[i],pieceCopySize);
    em_quickBoard[em_oldLoc].inhab = em_aStack[i];
    em_aStack[i]->location = em_quickBoard + em_oldLoc;
    }
    

    Unabhaegig davon, was der Code macht (Es ist eine Kopierprozedur) -
    ist das sinnvoll? im zeit-technischen Sinne?
    Es soll nur in jenem Fall, in dem das i gleich em_aId ist, etwas geringfuegig anderes gemacht werden, als in allen anderen Faellen. An welchem Index das i gleich em_aId ist, kann nicht vorhergesehen werden.

    Natuerlich koennte man alles in eine einzige Schleife packen:

    for(int i = 0; i < em_aPieceCount; ++i){
    if(i != em_aId){ /* diese Bedingung muss em_aPieceCount-1 mal 'ueberfluessiger'
     Weise ausgewertet werden */
    em_oldLoc = em_old_aStack[i]->location->index;
    memcpy(em_aStack[i],em_old_aStack[i],pieceCopySize);
    em_quickBoard[em_oldLoc].inhab = em_aStack[i];
    em_aStack[i]->location = em_quickBoard + em_oldLoc;
    }
    else{ /* dieser Zweig ist nur ein einziges Mal der Fall*/
    memcpy(em_aStack[em_aId],em_old_aStack[em_aId],pieceCopySize);
    em_quickBoard[em_pLoc].inhab = em_aStack[em_aId];
    em_aStack[em_aId]->location = em_quickBoard+em_pLoc;
    }
    }
    

    In der Variante 1 spare ich, wie es aussieht, bis zu 15 Vergleiche ein, dafuer muss zweimal eine Schleife gestartet werden.
    In der Variante 2 gibt's zwar nur eine Schleife, dafuer aber bis zu 15 Vergleiche mehr.
    Das klingt jetzt vielleicht nach einer Kleinigkeit, aber im Suchbaum wird diese Funktion millionenfach aufgerufen, und es stellt sich mir die Frage, ob jetzt das Anlegen von 2 Schleifen und dafuer die Ersparnis von 15 Vergleichen - oder aber das Anlegen einer einzigen Schleife (dafuer aber 15 Vergleiche) zusaetzlich, laufzeittechnisch geeigneter ist ?

    thx fuer Tipps !



  • Metatron5 schrieb:

    ... und es stellt sich mir die Frage, ob jetzt das Anlegen von 2 Schleifen und dafuer die Ersparnis von 15 Vergleichen - oder aber das Anlegen einer einzigen Schleife (dafuer aber 15 Vergleiche) zusaetzlich, laufzeittechnisch geeigneter ist ?
    thx fuer Tipps !

    Im Zweifelsfall Zeit stoppen.
    MfG,
    D.G.


Anmelden zum Antworten