Quote Originariamente inviata da MItaly Visualizza il messaggio
Non a caso per metà l'ho scritto io


Quote Originariamente inviata da MItaly Visualizza il messaggio
Se non sono indiscreto, che traccia hai scelto?
Tecnologia pervasiva, ma ho parlato in sostanza della società disinformata, non preparata alla tecnologia che si forma idee scorrette su alcuni argomenti e si espone a rischi inconsapevoli.

Quote Originariamente inviata da MItaly Visualizza il messaggio
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.
Non preoccuparti, succede in molti linguaggi: spesso le operazioni con le stringhe vengono sottovalutate, e pensa che sei fortunato che in C++ sono mutabili, in molti linguaggi sono immutabili e non ti dico che può venirne fuori in mani inconsapevoli. Il fatto è che pochi se ne rendono conto purtroppo.

Quote Originariamente inviata da MItaly Visualizza il messaggio
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
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
        }
    }
}
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%
Ma lui è gentile: ti pre-carica un sacco di roba che non userai ma dovrai consumare lo stesso solo per migliorare le prestazioni
Sei TU che vanifichi I SUOI SFORZI scrivendo quella brutta roba complicata u.u
Potevi fare a meno di scriverla!