Ver Mensaje Individual
  #5 (permalink)  
Antiguo 04/09/2010, 09:47
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 3 meses
Puntos: 22
Respuesta: Uso excecivo de endl;

Por ejemplo, cuando tienes algo como:
Código:
cout << "myText" << endl;
Eso es equivalente a tener:
Código:
cout << "myText" << "\n" << flush;
Es decir, con "endl" no solo agregas un salto de línea sino que además obligas a que los datos del bufer sean copiados de manera inmediata a su destino, en este caso la salida estándar.

Lo anterior debe quedar más claro con el siguiente ejemplo que utiliza un flujo hacía un archivo de texto:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5.  
  6. int main(){
  7.     ofstream sample("sample.txt");
  8.     sample << "important" << endl;
  9.     sample << "unimportant\n";
  10.  
  11.     int n = 1;
  12.     n = n / --n; //ouch!
  13.     return 0;
  14. }

La intención del programa anterior es garantizar que "important" sea copiado a su destino (sample.txt) a pesar de que el programa termine inesperadamente. Como podrás darte cuenta eso se logra facilmente utilizando endl, cosa que no sucede con "unimportant" ya que el bufer de salida no es copiado a su destino como sucedería habitualmente con un programa que termina de manera normal.

Bien, en cuestión de rendimiento muchas veces puede ser innecesario el uso excesivo del flush, que esto a su vez puede traducirse en un uso excesivo de endl, por ejemplo; no es lo mismo escribir 200000 líneas en un archivo de texto donde cada línea se va copiando de manera permanente a través de un endl, que almacenar todas las líneas con su respectivo salto de línea y utilizar un solo flush al final.

Ejemplo:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. using namespace std;
  5.  
  6. int main(){
  7.     clock_t start, end;
  8.     double dif;
  9.  
  10.     ofstream out1("out1.txt");
  11.     ofstream out2("out2.txt");
  12.  
  13.     start = clock();
  14.     for(int i = 0; i < 200000; i++){
  15.         out1 << ".\n";
  16.     }
  17.     out1.flush();
  18.     end = clock();
  19.     dif = (end - start)/static_cast<double>(CLOCKS_PER_SEC);
  20.     cout << "out1: " <<  dif << "sec." << endl;
  21.  
  22.     start = clock();
  23.     for(int i = 0; i < 200000; i++){
  24.         out2 << "." << endl;
  25.     }
  26.     end = clock();
  27.     dif = (end - start)/static_cast<double>(CLOCKS_PER_SEC);
  28.     cout << "out2: " <<  dif << "sec." << endl;
  29.  
  30.     return 0;
  31. }

En fin, la cuestión que creo importante es conocer la diferencia entre un salto de línea y endl, porque eso te permite identificar zonas de mejora en el rendimiento de una aplicación, sobre todo aquellas aplicaciones con gran demanda de I/O hacía archivos externos.