2011-01-25 21 views
6

¿Hay alguna manera de hacer que esto funcione más rápido y aún hacer lo mismo?¿Cómo puedo hacer cout más rápido?

#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++ || SO: Windows

+9

probablemente será más rápido para construir una cadena y salida que una vez, o una vez por ciclo externo, que sería 1 o 20 couts, en lugar de 20 * 80 = 1600 –

+4

@Marc B: se supone que una biblioteca de E/S en búfer se ocupará de eso por usted. Desafortunadamente, las transmisiones ios de C++ son lentas tanto en el almacenamiento en búfer como en la E/S. Mire las preguntas que le hice si quiere ver algunos buenos puntos de referencia que demuestren cuán miserables son. –

+0

@Ben Voigt - Y es realmente decepcionante. Podrían ser más rápidos que la biblioteca stdio de C si hubieran sido diseñados con más cuidado. :-( – Omnifarious

Respuesta

4

Como se ha dicho Marc B en los comentarios, poniendo el resultado en una cadena primero debe ser más rápido:

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, preasignar esa cadena. 'std :: string' no necesariamente tiene patrones de asignación optimizados como por ejemplo' std :: vector'. –

+0

@Ben Voigt: Estaría muy decepcionado si fuera necesario ... esto definitivamente suena como una cuestión de calidad de implementación ... –

+2

@ Matthieu M: Dudo que cualquier implementación de cadena predeterminada reserve 1600 bytes. Por lo tanto, es probable que haya múltiples reasignaciones antes de terminar de escribir. Solo una buena idea reservar previamente el espacio requerido. –

1

Claro, use putchar de stdio.h.

+1

Esto no fue más rápido. – Mark

+0

@Mark: ¿en serio? ¿Estás seguro de que es tu programa el cuello de botella? y no la ventana de la consola? ¿Puedes verificar si es más rápido cuando la salida se redirige a un archivo? –

+0

El problema aquí no es usar C++ vs. C. (Y de hecho, en su ejemplo, sería putchar() de cstdio). El problema es imprimir datos para cada personaje. – BjoernD

1

La solución obvia es la de declarar la matriz box diferente:

char box[20][81]; 

Luego puede cout una fila a la vez. Si no puede hacer esto por la razón que sea, entonces no hay necesidad de utilizar std :: string aquí - una matriz char es más rápido:

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

Eso es lo que estaba pensando. No es necesario asignar dinámicamente una matriz que tenga el mismo tamaño cada vez. – GManNickG

Cuestiones relacionadas