Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Uso excecivo de endl;

Estas en el tema de Uso excecivo de endl; en el foro de C/C++ en Foros del Web. Hola a todos, quiciera saber por que no es recomendable el uso execivo de endl, yo lo uso casi siempre para sacar una nueva linea, ...
  #1 (permalink)  
Antiguo 03/09/2010, 15:40
 
Fecha de Ingreso: agosto-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Uso excecivo de endl;

Hola a todos, quiciera saber por que no es recomendable el uso execivo de endl, yo lo uso casi siempre para sacar una nueva linea, gracias
  #2 (permalink)  
Antiguo 03/09/2010, 18:07
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Uso excecivo de endl;

De donde sacaste esa informacion??
  #3 (permalink)  
Antiguo 03/09/2010, 18:30
 
Fecha de Ingreso: agosto-2010
Mensajes: 153
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Uso excecivo de endl;

pues por ahi lo lei, pero diganme entonces si es cierto o no hay problema

cout << "hola" << endl;
cout << "hola" << endl;
cout << "hola" << endl;
cout << "hola" << endl;
cout << "hola" << endl;

esto es execivo o esta bien, gracias
  #4 (permalink)  
Antiguo 04/09/2010, 02:31
 
Fecha de Ingreso: septiembre-2010
Mensajes: 60
Antigüedad: 13 años, 8 meses
Puntos: 5
Respuesta: Uso excecivo de endl;

Si lo que quieres es mostrar cinco "hola", uno en cada línea, está bien. No te preocupes :)

No sé de dónde habrás sacado esa información, pero así fuera de contexto no tiene mucho sentido. Sería por algún caso particular, pero en general no tiene nada de malo. O tal vez sería alguna opinión de los que están en contra de utilizar cout.
En cualquier caso, no hay ningún problema.
  #5 (permalink)  
Antiguo 04/09/2010, 09:47
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 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.
  #6 (permalink)  
Antiguo 04/09/2010, 10:55
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Uso excecivo de endl;

En c y usando la funcion printf al detectar un '\n' te vacia el buffer. No pasa lo mismo en C++?
  #7 (permalink)  
Antiguo 04/09/2010, 19:14
 
Fecha de Ingreso: septiembre-2010
Mensajes: 60
Antigüedad: 13 años, 8 meses
Puntos: 5
Respuesta: Uso excecivo de endl;

Nunca te acostarás sin saber algo nuevo... no sabía yo eso del endl.
Lo que sí sé es que el printf, al menos en linux con gcc, al ponerle un \n vacía el buffer de salida. Y el c++ con g++ tres cuartos de lo mismo.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:45.