Originariamente inviata da
MItaly
Calcolo di area di poligoni originariamente in Montecarlo, riscritto in maniera esatta, credo sia passato a un decimo del tempo.
Algoritmo di espansione di aree su immagine, scritto in maniera cretina con astrazioni e allocazioni inutili ci metteva tipo un secondo e mezzo, riscritto a modino 200 ms o qualcosa del genere (con tra l'altro una feature di conservazione delle aree piccole ma significative che mancava all'altro).
Parsing di un formato vagamente tipo ISO in C++; lettura malamente bufferizzata di una riga alla volta, ogni volta allocata dinamicamente ex-novo (buffer fuori dal ciclo), con una trim (due allocazioni inutili) e diverse substr solo per fare confronti di inizio stringa (peraltro in if in sequenza invece che in else if). Sistemato il buffering, spostata la stringa fuori dal loop (con clear ogni volta, ma senza effettivamente liberare la memoria), uccise tutte le substr, trim inplace, da una decina di allocazioni inutili nel loop a zero. È passato da circa 8 secondi (su un caso di test) a un centinaio di ms.
Dump di file testuale lento come lo schifo. Andando di profiler salta fuori che il collo di bottiglia è la fprintf, che perde una marea di tempo a fare delle getenv.
Long story short, fino ad una certa versione di MinGW non sapevano decidersi se la printf con il %f di default dovesse avere non so se 3 o 4 decimali, perché di default mi sembra glibc aveva 4 mentre il runtime Microsoft ne aveva 3 e quindi hanno fatto che si poteva andare in override con una variabile d'ambiente.
La cosa, già discutibile di per sé, è resa disastrosa dal fatto che questa variabile d'ambiente viene riletta ad ogni chiamata (cosa abbastanza senza senso, visto che di norma le variabili d'ambiente non cambiano dopo l'avvio del processo), e la getenv è una funzione mediamente lenta rispetto a printf "semplici", dato che tutte le volte ri-effettua una ricerca lineare dentro il blocco dell'environment del processo (senza mai trovare la stringa che cerca, quindi caso pessimo). Morale della cosa, le printf in media erano 8 volte più lente del dovuto.
Nei MinGW successivi avevano risolto la cosa cachando il risultato di questo lookup, ma cambiare il compilatore (e ricompilare una montagna di librerie tra cui Qt) due minuti prima di un rilascio era lungo e rischioso. Ergo: ho fatto una patch binaria alla libreria standard.
Cambiando tre
bit nella libreria statica il tempo di dump è passato da un 30 secondi a 5.