Ott 092010
 
Benritrovati con questo nuovo articolo. Il titolo è forse un po’ criptico ma mi spiegherò subito meglio. Quando utilizzavo il Borland C Builder avevo a disposizione una fantastica classe per la gestione delle stringhe, le AnsiString. Passando alle wxWidgets mi ritrovo la wxString, che ovviamente sono del tutto incompatibili dal punto di vista delle funzioni membro per cui, in sostanza, tutto il codice deve essere riscritto. Le AnsiString sono note per la loro versatilità ma allo stesso tempo per la loro lentezza. Giunto alle wxWidgets ammetto di essermi trovato non poco spiazzato dalle wxString. Ho avuto non poche difficoltà a comprendere le varie strade per convertire i dati da un formato ad un’altro come ad esempio da stringa ad intero e viceversa. Allo stesso modo non ho trovato un corrispettivo per la rappresentazione esadecimale, ed ho speso non poco tempo a convertire tutti i “testi” in _(“testi”).  Ritengo che l’estrema flessibilità delle wxString comporti una certa complessità di apprendimento inoltre sospettavo che questa complessità si pagasse anche con scarse prestazioni, ma non trovavo nulla in rete e non avevo dati certi alla mano. Avendo fatto il traumatico salto dalle VCL Borland alle wxWidgets, mi chiedevo inoltre se magari fra 10 o 20 anni mi ritroverò a dover fare di nuovo un passo del genere e se nel qual csao non mi sia più conveniente scrivermi una classe per conto mio che poi potrei riutilizzare indipendentemente dalla piattaforma. Qualcuno potrebbe obiettare che potrei usare la classe string del C++: assolutamente vero anche se ammetto, da programmatore C e ignorantone del C++, che sino a pochi giorni orsono non sapevo nemmeno esistesse. L’ho studiacchiata un pò negli ultimi giorni e devo dire che probabilmente sarebbe una buona soluzione, anche se come per le AnsiString e le wxString ha il “difetto” di essere pensata per gestire semplici stringhe di caratteri e non sia invece così indicata per l’utilizzo di stringhe di dati binari che sono magari più utili nella gestione dei socket, delle trasmissioni seriali, nelle lettura di dati binari, etc. Per tale motivo mi sono scritto una piccola classe (ancora incompeta) per eseguire alcuni test, ed i risultati sono il motivo di questo articolo. Il risultato è che le wxString hanno performance decisamente scadenti per cui sono da abolire nel caso di segmenti di codice “time-critical”.

Ho fatto alcuni test, per ora solo di copia di stringhe, assegnazione di stringhe alfanumeriche e lettura / scrittura di singoli caratteri mentre non ho ancora testato funzioni più avanzate come ad esempio l’estrazione di substringhe in quanto nella mia classe tali funzioni non sono ancora diponibili.

Il test di per se è banale e ve  lo riporto qui sotto esattamente come l’ho scritto, compresi gli errori di scrittura nelle stringhe 🙂

void test3(void)
{
int i=0;
string ciccio,pippo;
char a;
pippo="Questo è un test";
ciccio="questo è una strnga di almeno 20 caratteri";
for(i=0;i<subloop;i++) ciccio=pippo;
for(i=0;i<subloop;i++) ciccio="questa è una lunga asegnazione di una stringa fissa che contiene parecchi caratteristi visto che con le assegnazioni brevi ci sono poche variazioni sul tema";
for(i=0;i<subloop;i++) {a=ciccio[i%20];ciccio[i%22]=a+1;}

}

Il test è stato ripetuto 200000 volte con misura dei tempi di esecuzione, per 10 volte ed i risultati qui sotto sono le medie delle 10 misurazioni (tempi in secondi):

wxString: 0,607700

SS_String (mia): 0,034300

string (c++): 0,040700

Si vede chiaramente che la mia classe (SS_String) e la classe string c++ hanno tempi di esecuzione sovrapponibili mentre le wxString sono fra le 15 e le 20 volte più lente! Faccio notare che la classe string del c++ anche se leggermente più lenta effettua più controlli sui dati a disposizione, cosa che le mie routines non fanno. La classe da me creata ha il preciso scopo di essere il più veloce possibile anche a scapito di un controllo decisamente meno rigoroso.

Bene, anche se questa volta non vi riporto alcuna parte di codice, spero comunque vi sia stato utile conoscere quanto siano lente le wxString per poterle sostituire nei frammenti di codice più critici con le string del c++ o con funzioni scritte ad OK.