Non a caso per metà l'ho scritto io
Se non sono indiscreto, che traccia hai scelto?Purtroppo, e già in italiano mi preoccupo del fuori tema. Titoli di 2 parole, mai visti prima![]()
Comunque oggi si è visto come le stringhe C++ usate malamente possano costare veramente tanto... al di là di un'altra serie di bachi mostruosi (per cui attualmente questa routine di caricamento di un modello viene chiamata tipo 3 volte per ogni ordine che si carica), c'era una routine di pre-parsing del file (per estrarre solo alcune informazioni sul contenuto) che portava via circa 13 secondi per un modello da 5 MB (~12 decompressa).
Salta fuori che il collo di bottiglia era roba del tipo if(line.substr(0, 4)=="ABC ") ripetuta per qualche volta; rimossi i temporary (e quindi tre allocazioni dinamiche per ogni riga di un file da decine di migliaia di righe) più qualche altra ottimizzazione il runtime è passato da 13 a 1 secondo.
Altra roba notevole: quanto costano i branch misprediction sulle architetture attuali! Nel più inner loop di tutti gli inner loop di un algoritmo piuttosto complesso a cui sto lavorando c'è sostanzialmente la scansione dei pixel in diagonale di una piccola bitmap, fatta partendo da ogni y dell'immagine.
Per fare questo, sostanzialmente c'era una cosa del tipo
Ora, facendo profiling è saltato fuori che i colli di bottiglia erano le coppie cmp/jump: l'if(px) è costosa (perché l'immagine ha un andamento non ben prevedibile dal branch predictor) ma inevitabile; invece, precalcolando fuori il limite corretto di r (invece di fare il controllo sulla posizione risultante) e rimuovendo così la necessità del primo if è venuto fuori un incremento di prestazioni di tutto l'algoritmo di un buon 30%codice:for(int y=a; y<limit; ++y) { offset.y=y; for(double r; ; ++r) { Point p = r*direction + offset; if(p.x > img.width || p.y >img.height || p.x<0 || p.y<0) break; Pixel px=img.pixel(p.x, p.y); if(px) { // eccetera } } }![]()