Performance Crash mit globalen(statischen) Objekt



  • Hallo ersteinmal:

    Problembeschreibung:

    Modul1:

    SI_32 search(...)
    {
    //LOCALS
    ....

    VARIANTE_1: if(condition) {call eval(); return(0);}
    VARIANTE_2: if(condition) {v = eval() ; return(v);}
    VARIANTE_3: if(condition) {return(eval());}

    //code
    ....
    }

    Modul2:
    SI_32 eval(...)
    {

    VARIANTE_A: OBJ obj[1];
    VARIANTE_B: static OBJ obj[1];

    //code
    ....

    return(obj->value);
    }

    Variante_1 ist der gewünschte Performance-Fall.(leider nicht zu gebrauchen,
    da berechnte evaluierung nicht verwendet wird)

    In Variante_2+3 und Variante_B, dass heisst sobald ich den Member-Wert in irgendeiner art zuweise, oder das objekt aus eval() statisch(global) ist
    -> PERFORMANCE CRASH (Faktor 100)

    Der Witz an der Sache ist,dass garantiert derselbe Code durchlaufen wird.

    Hat jemand eine Idee woran das liegen kann,oder schonmal ähnliche Probleme gehabt?



  • Rembrandt? Ägypten?
    Ich sehe nicht, wo das etwas mit Forumsthema zu tun hätte ... sieht wie von einem Bot ausgespuckt aus.

    Gruß,

    Simon2.



  • Nun, es kann lediglich etwas mit Handling von C++ Objekten zu tun
    haben.
    Ich kann auch original code posten.

    (1.bin ich neu,2. kann ich wohl nur hier richtig sein, 3. geht es freundlicher)



  • Desperado schrieb:

    sobald ich den Member-Wert in irgendeiner art zuweise, oder das objekt aus eval() statisch(global) ist
    -> PERFORMANCE CRASH (Faktor 100)

    Es sind leider zu wenig Infos, um mehr als raten zu können. Das Einzige was mir einfällt: Um was für ein Objekt handelt es sich denn, wird evtl durch den Kopierkonstruktor und/oder Zuweisungsoperator viel Zeit verschlungen?

    "return eval()" müsste durch die RVO (Return-Value-Optimization) eigentlich auch performanter sein als "v=eval(); return v;".

    edit: Und eine statische Variable ist nicht gleich global 😉 Das Wort "global" bezeichnet eigentlich den Sichtbarkeitsbereich, eine statische Variable in einem Funktionskörper ist aber nur in dieser Funktion sichtbar.



  • hm, wie kann ich code posten, ohne das die formatierung dahingeht?
    (sorry)



  • Desperado schrieb:

    ...3. geht es freundlicher)

    😉
    Das bestimmt - leider kommt es hier nicht selten vor, dass irgendwelche Bots und/oder Trolle Zeug reinposten; da kann es schonmal passieren, dass es den Falschen erwischt. Sorry.

    Desperado schrieb:

    hm, wie kann ich code posten, ohne das die formatierung dahingeht?
    (sorry)

    Mit cpp-Flags. Entweder "unten" auf den "C/C++"-Button oder selbst entsprechend "cpp" und "/cpp" in eckige Klammern (statt ") setzen.
    Aber bitte: Nicht 1000 Zeilen, sondern möglichst nur einen Ausschnitt relevanten Codes...

    Gruß,

    Simon2.



  • //--------------------------------------
    
    	struct COLLECTION
    		{
    		 //GENERAL
    		 //--------------------------------------
    
    		 BTB	btb[PIECETYPE];
    		 UI_08	mat[PIECETYPE];
    
    		 ATTACK_T  ctl[ID_64][COLOR];
    
    		 //PAWNINFO
    		 //--------------------------------------
    
    		 BTB	psd[COLOR];	//passed pawns
    		 BTB	iso[COLOR]; //isolated pawns
    
    		 BTB	sof[COLOR]; //semiopen files
    		 BTB	ofl;		//open files
    
    		 UI_08	ils[COLOR]; //pawniles counter
    
    		 void clr(void){static const COLLECTION c;*this=c;}
    
    		};
    
    	//--------------------------------------
    
    	struct SCORE 
    		{
    		 //all features scored from white view
    
    		 SI_32 material[COLOR];
    		 SI_32 isolani[COLOR];
     		 SI_32 balance[COLOR];
    
    		};
    
    	//--------------------------------------
    
    /*----------------------------------------------------------------------------*/
    
    SI_32 eval(UI_16 tid,BOARD *brd)
    	{
    	 //LOCALS
    	 //--------------------------------------
    
    	 BTB tmp,ctl;
    	 SQUARE sq64,dst;
    	 PIECE  pce12;
    
    	 SI_32 v = VBALANCE;
    
    	 COLLECTION collect[MAXTHREADS];
    	 SCORE		score[MAXTHREADS];
    
    	 //COLLECTION *const p = &collect[tid];
    
    	 //SETTINGS
    	 //--------------------------------------
    
    	 collect[tid].clr();
    
    	 score[tid].balance[WHITE]=
    	 score[tid].balance[BLACK]= 0;
    
    	 //LOOP WHITE PIECELIST
    	 //--------------------------------------
    
    	 tmp = brd->wpl;
    
    	 while(tmp)
    		{
    		 sq64 = bsf64(tmp);
    
    		 pce12 = toPCE12[brd->sq[toX88[sq64]]];
    
    		 collect[tid].mat[pce12]++;
    
    		 ctl = p_attack(brd,sq64);
    
    		 while(ctl)
    			{
    			 dst = bsf64(ctl);
    
    			 inc_attack(tid,collect,sq64,pce12,WHITE);
    
    			 CLB64(ctl);
    			}
    
    		 CLB64(tmp);
    		}
    
    	 //LOOP BLACK PIECELIST
    	 //--------------------------------------
    
    	 tmp = brd->bpl;
    
    	 while(tmp)
    		{
    		 sq64 = bsf64(tmp);
    
    		 pce12 = toPCE12[brd->sq[toX88[sq64]]];
    
    		 collect[tid].mat[pce12]++;
    
    		 ctl = p_attack(brd,sq64);
    
    		 while(ctl)
    			{
    			 dst = bsf64(ctl);
    
    			 inc_attack(tid,collect,sq64,pce12,BLACK);
    
    			 CLB64(ctl);
    			}
    
    		 CLB64(tmp);
    		}
    
    	 //PAWNSTRUCTURE ANALYSIS
    	 //--------------------------------------
    
    	 pawnstruct(tid,collect);
    
    	 //SCORE COLLECTED DATA
    	 //--------------------------------------
    
    	 score_material(tid,collect,score);
    	 score_isolani(tid,collect,score,brd);
    	 score_passer(tid,collect,score,brd);
    
    	 //printf("\n%d ",score[tid].balance[brd->ctm]);
    
    	 return(score[tid].balance[brd->ctm]);
    	}
    
    /*----------------------------------------------------------------------------*/
    
    /*----------------------------------------------------------------------------*/
    
    SI_32 search_full(UI_16 tid,BOARD *brd,SI_32 alpha,SI_32 beta,SI_16 rdp,UI_16 cdp)
    	{
    	 SI_32 vcur,vbst;
    	 UI_16 mnb;
    	 UNDO undo[1];
    	 MLIST mli[1];
    
    	 scontrol->nds++;
    
    	 //INTERRUPT SEARCH
    	 //--------------------------------------
    
    	 if(INTERRUPT) go(scontrol);
    
    	 //HORIZON
    	 //--------------------------------------
    
    	 if(rdp<=0) {eval(tid,brd);return(0);}
    
    	 //GENERATE (PSEUDOLEGAL) MOVES
    	 //--------------------------------------
    
    	 gen[brd->ctm](brd,mli);
    
    	 //LOOP MOVELIST
    	 //--------------------------------------
    
    	 for(mnb=0;mnb<mli->sze;mnb++)
    		{
    		 move_do(brd,undo,mli->mve[mnb]);
    
    		 if(!incheck(brd,!brd->ctm))
    			{
    			 vcur = -search_full(tid,brd,-beta,-alpha,rdp-1,cdp+1);
    			}
    
    		 //update_best()
    
    		 move_undo(brd,undo);
    		}
    
    	 return(vbst);
    	}
    
    /*----------------------------------------------------------------------------*/
    


  • Danke Simon2 ("sorry" angenommen), hoffe ich hab den Rahmen nicht gesprengt mit
    dem Source...



  • Auch danke ersteinmal..., mir sind die Unterschiede zwischen statics/globals bekannt.
    Der Effekt ist für mein problem derselbe. deshalb schrieb ich static(global)...


Anmelden zum Antworten