STD extremadamente lento :: COUT utilizando MS Compiler -- ++ campo con performance campo con visual-c++ campo con cout camp Relacionados El problema

Extremely slow std::cout using MS Compiler


4
vote

problema

Español

Estoy imprimiendo el progreso de muchas iteraciones de un cálculo y la salida es en realidad la parte más lenta de ella, pero solo si uso visual C ++ Compiler, MingW funciona bien en el mismo sistema.

Considere el siguiente código:

  #include <iostream> #include <chrono>  using namespace std; #define TO_SEC(Time)      chrono::duration_cast<chrono::duration<double> >(Time).count(); const int REPEATS = 100000;  int main() {     auto start_time = chrono::steady_clock::now();      for (int i = 1; i <= REPEATS; i++)          cout << ' ' << i << "/" << REPEATS;      double run_time = TO_SEC(chrono::steady_clock::now() - start_time);     cout << endl << run_time << "s" << endl; }   

Ahora la salida que recibo cuando se compila con MINGW ("G ++ Source.CPP -STD == C ++ 11") es:

  100000/100000  0.428025s   

Ahora, la salida que recibo cuando se compila con Visual C ++ Compiler Noviembre de 2013 ("cl.exe source.cpp") es:

  100000/100000 133.991s   

que es bastante absurda. Lo que viene a la mente es que VC ++ está realizando espacios innecesarios.

¿Alguien sabría cómo prevenir esto?

Editar: La configuración es:

GCC Versión 4.8.2 (GCC), Target I686-PC-Cygwin

Microsoft (R) C / C ++ Optimización de la versión del compilador 18.00.21005.1 para x86

Windows 7 Professional n 64 bit con CPU i7-3630QM, 2.4GHz con 8.00 GB RAM

Original en ingles

I am printing progress of many iterations of a computation and the output is actually the slowest part of it, but only if I use Visual C++ compiler, MinGW works fine on the same system.

Consider following code:

#include <iostream> #include <chrono>  using namespace std; #define TO_SEC(Time) \     chrono::duration_cast<chrono::duration<double> >(Time).count(); const int REPEATS = 100000;  int main() {     auto start_time = chrono::steady_clock::now();      for (int i = 1; i <= REPEATS; i++)          cout << '\r' << i << "/" << REPEATS;      double run_time = TO_SEC(chrono::steady_clock::now() - start_time);     cout << endl << run_time << "s" << endl; } 

Now the output I get when compiled with MinGW ("g++ source.cpp -std==c++11") is:

100000/100000  0.428025s 

Now the output I get when compiled with Visual C++ Compiler November 2013 ("cl.exe source.cpp") is:

100000/100000 133.991s 

Which is quite preposterous. What comes to mind is that VC++ is conducting unnecessary flushes.

Would anybody know how to prevent this?

EDIT: The setup is:

gcc version 4.8.2 (GCC), target i686-pc-cygwin

Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86

Windows 7 Professional N 64-bit with CPU i7-3630QM, 2.4GHz with 8.00GB RAM

           
         
         

Lista de respuestas

11
 
vote
vote
La mejor respuesta
 

std::cout en MSVC es lento ( https://web.archive.org/web/20170329163751/ https://connect.microsoft.com/visualstudio/feedback/details/642876/std-wcout-is-ten-times-slower-than-wprintf-performance-bug-in-c-library ). < / p>

Es una consecuencia desafortunada de cómo nuestra biblioteca estándar C y C ++ Las implementaciones están diseñadas. El problema es que al imprimir a la consola (en lugar de, digamos, siendo redirigido a un archivo), ni nuestro C Tampoco C ++ I / O se amortiza por defecto. Esto a veces se oculta por El hecho de que C E / S funcione como Printf () y pone () temporalmente Habilita el búfer mientras haces su trabajo.

Microsoft sugiere esta solución (para habilitar el búfer en COUT / STDOUT):

  setvbuf(stdout, 0, _IOLBF, 4096)   

También podría intentarlo con:

  cout.sync_with_stdio(false);   

pero probablemente no hará una diferencia.

 

std::cout in MSVC is slow (https://web.archive.org/web/20170329163751/https://connect.microsoft.com/VisualStudio/feedback/details/642876/std-wcout-is-ten-times-slower-than-wprintf-performance-bug-in-c-library).

It is an unfortunate consequence of how our C and C++ Standard Library implementations are designed. The problem is that when printing to the console (instead of, say, being redirected to a file), neither our C nor C++ I/O are buffered by default. This is sometimes concealed by the fact that C I/O functions like printf() and puts() temporarily enable buffering while doing their work.

Microsoft suggests this fix (to enable buffering on cout/stdout):

setvbuf(stdout, 0, _IOLBF, 4096) 

You could also try with:

cout.sync_with_stdio(false); 

but probably it won't make a difference.

 
 
 
 
0
 
vote

Evite usar STD :: Endl, pero use en su lugar " n". STD :: Endl se supone que se descarga de acuerdo con el estándar.

 

avoid using std::endl but use instead "\n". std::endl is supposed to flush according to the standard.

 
 

Relacionados problema

0  No hay impresión de COUT en la función de inicio de Pthread  ( No cout printing in pthread starting function ) 
Soy nuevo aquí y noob con la programación PTHEAD. Mi problema está en una clase C ++, que estoy tratando de crear para encapsular un hilo. Leyendo alrededor d...

1  CIN Falla de obtener la entrada  ( Cin failing to get the input ) 
Quiero poder leer lo siguiente: myvar = { 1 2 3 5 } Entonces, lo que he hecho es string input; int intInput; cin >> input; //take in the varname, d...

0  Orden de salida con flujo de salida de cout  ( Order of outputting with cout output stream ) 
Estoy tratando de ejecutar este código simple int a=0; cout<<a<<a++; Pero la salida no es lo que esperaba 10 esperaría "00" y a = 1, ¿por qué la...

0  ¿Por qué cout.precision () aumenta la precisión del punto de flotación?  ( Why does cout precision increase floating points precision ) 
Entiendo que los números de un solo punto flotante tienen la precisión de aproximadamente 6 dígitos, por lo que no es sorprendente que el siguiente programa s...

0  Combinar la aplicación basada en la consola y con Windows  ( Combine console based and windows based application ) 
Aunque estoy usando DirectX con una función habitual Edit Button2626 en mi aplicación que quiere crear una salida a la consola (con el Edit Button27 ) si l...

2  Impresión a los grados de consola de Windows (°) y el símbolo de cubo (³)  ( Printing to windows console degrees and cube symbol %c2%b3 ) 
Estoy trabajando en un programa de consola de Windows C ++ y necesito imprimir grados (°) y el símbolo de cubo (³). Hay toneladas de información sobre el ° ...

1  Mostrando un iterador a un vector  ( Displaying an iterator to a vector ) 
Estoy trabajando en un proyecto donde estoy colocando un enumeración en un vector. Y me preguntaba cómo podía obtener funcionalidad como tal fuera del vector....

1  ¿Cuántos caracteres o caracteres, o bytes de datos STD :: COUT puede emitir a la vez?  ( How many chars or characters or bytes of data stdcout can output at once ) 
Estoy aprendiendo C ++, por lo que es muy correcto asumir que soy nuevo en C ++ y la programación también. Estoy tratando de entender iostream Library, no...

2  Error: No hay coincidencia para 'Operador << "en' Std :: COUT  ( Error no match for operator in stdcout ) 
Me doy cuenta de que este error generalmente se debe a algunas sintaxis o problemas de tipo, pero no estoy seguro de cómo resolver este problema. Creo que pue...

0  COUT no funciona con el archivo de encabezado de Ostream  ( Cout not working with ostream header file ) 
He leído que COUT es un objeto de Ostream ... pero ¿por qué este código pio app list0 Lanzar un error: - pio app list111 ¿Me voy mal en mi enten...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos