2011-01-25 2 views
6

C'è un modo per rendere questa corsa più veloce e fare ancora la stessa cosa?Come posso rendere più veloce il cout?

#include <iostream> 

int box[80][20]; 

void drawbox() 
{ 
    for(int y = 0; y < 20; y++) 
    { 
     for(int x = 0; x < 80; x++) 
     { 
      std::cout << char(box[x][y]); 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    drawbox(); 
    return(0); 
} 

IDE: DEV C++ || Sistema operativo: Windows

+9

probabilmente più veloce per costruire una stringa e di uscita che, una volta, o una volta per ciclo esterno, che può essere 1 o 20 couts, piuttosto che 20 * 80 = 1600 –

+4

@Marc B: una libreria I/O con buffer dovrebbe occuparsi di ciò per voi. Sfortunatamente, gli iostream del C++ sono lenti per il cane sia nel buffering che nell'I/O. Guarda le domande che ti ho posto se vuoi vedere alcuni bei benchmark che mostrano quanto siano miserabili. –

+0

@Ben Voigt - Ed è davvero deludente. Potrebbero essere più veloci della libreria stdio di C se fossero stati progettati con più attenzione. :-( – Omnifarious

risposta

4

Come Marc B detto nei commenti, mettendo l'uscita in una stringa prima dovrebbe essere più veloce:

int box[80][20]; 

void drawbox() 
{ 
    std::string str = ""; 
    str.reserve(80 * 20); 

    for(int y = 0; y < 20; y++) 
    { 
     for(int x = 0; x < 80; x++) 
     { 
      str += char(box[x][y]); 
     } 
    } 

    std::cout << str << std::flush; 
} 
+12

oh, preallocare quella stringa. 'std :: string' non ha necessariamente pattern di allocazione ottimizzati come ad esempio' std :: vector'. –

+0

@Ben Voigt: Sarei molto deluso se fosse necessario ... questo sicuramente sembra un problema di implementazione della qualità ... –

+2

@ Matthieu M: Dubito che qualsiasi implementazione di stringa predefinita riserva 1600 byte. Quindi è probabile che ci saranno più riallocazioni prima di finire la scrittura. È solo una buona idea prenotare in anticipo lo spazio richiesto. –

1

Sicuro, utilizzare putchar da stdio.h.

+1

Questo non era più veloce – Mark

+0

@Mark: davvero? Sei sicuro che il tuo programma sia il collo di bottiglia? e non la finestra della console? Puoi verificare se è più veloce quando l'output viene reindirizzato a un file? –

+0

Il problema qui non sta usando C++ vs. C. (E infatti, nel suo esempio sarebbe putchar() da cstdio). Il problema è la stampa di dati per ogni personaggio. – BjoernD

1

La soluzione ovvia è di dichiarare la matrice box diversamente:

char box[20][81]; 

Quindi puoi cout una riga alla volta. Se non è possibile fare questo per qualsiasi motivo, allora non c'è bisogno di usare std :: string qui - una matrice char è più veloce:

char row[81] ; row[80] = 0 ; 
for (int y = 0; y < 20; y++) 
    { 
    for (int x = 0 ; x < 80 ; x++) 
    row[x] = char(box[x][y]) ; 
    std::cout << row ; 
    // Don't you want a newline here? 
    } 
+0

Questo è quello che stavo pensando. Non è necessario allocare dinamicamente un array sempre della stessa dimensione. – GManNickG