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)...