Newsgroup: it.comp.lang.c++
Titolo: Ottimizzare questa funzione

static int callbackInsertIntoFile(void *NotUsed, int argc, char **argv, char
**azColName){
 strTemp.erase();
 strTemp.append(argv[1]);
 strTemp.append("\n");
 fputs(strTemp.c_str(),fileName);
 strTemp.erase();
 return 0;
}
Voi come ottimizereste questa funzione ! Mi occupa parecchia CPU ma non mi
sembra che sia molto dispendiosa in risorse, forse è SQLite ad essere un
pesante ?


Non mi sembra che nella funzione citata sia utilizzato SQLite.
Piuttosto, il tuo codice esegue costose allocazioni di memoria dinamica.
Supponendo che 'strTemp' sia di tipo 'string', prova il seguente codice:
static int callbackInsertIntoFile(void *NotUsed, int argc, char **argv, char
  **azColName){
  fputs(argv[1], filename)
  fputc('\n', filename)
  return 0;
}
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 ha scritto nel messaggio
news:c877l8$sme$1...@lacerta.tiscalinet.it...

Grazie provo subito, questa è la funzione di callback del risultato select
di SQLite !

La funzione va decisamentemeglio !
Ora come posso sostituire una cosa del genere :
stringa.append("|");
stringa.append(buffer);
stringa.append("|");
Per farsi che non venga riallocata 2 volte la memoria, c'è un modo per
concatenare in append ?

 
Prova cosi
stringa.append("|" + buffer + "|");
Magari è na stupidata ma magari no :D
-- 
Tnk
Luca "Kleidemos" Francesca
Un computer a un altro quando si incontrano:
"Ciao, come ti boota oggi???"


Niente mi dice  error C2110: cannot add two pointers .

snow...@email.it
 wrote:

Il metodo 'append' concatena in append !
Alternativamente, si puo' scrivere l'espressione equivalente:
stringa += buffer;
Per evitare che sia riallocata la memoria, usa:
stringa.reserve(N);
dove N e' il numero di caratteri che vuoi che la stringa contenga 
evitando la riallocazione.


 ha scritto nel messaggio
news:c87hsb$4qm$1...@lacerta.tiscalinet.it...

Quindi non vi è altro modo per far si che bossa fare "|"+buffer+"|" con un
inserimento solo ?

snow...@email.it
 2004-05-16 :

scusa, ma perché non utilizzi uno stringstream?
E se proprio vuoi eliminare i fronzoli, perché non usi un vettorone di
char e un paio di puntatori per la posizione lì dentro?

 
Puoi usare:
   stringa += string("|") + buffer + "|";
oppure uno stringstream, ma non migliori le prestazioni. Il tuo non era 
un problema di ottimizzazione?


    stringa += string("|") + buffer + "|";
Nel senso , fare questa che mi hai detto tu e fare 3 append è uguale oppure
quella che hai appena scritto tu alloca solo una volta la memoria ?


La prima che hai detto.
Ripeto pero' che usando la 'reserve' si evitano riallocazioni inutili.


 Ripeto pero' che usando la 'reserve' si evitano riallocazioni inutili.
E quindi deve fare una reserve di strlen(buffer) + 2 (se buffer è una char*)
--- bye



stringa.append((string) "|" + buffer + "|");
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo


 Due domande !
- Se uso la reserve, quando faccio un stringa.erase() devo riare il reserve
? Penso i no
- Secondo se faccio un reserve i 10 e invece poi faccio un append di 11 che
succede ?