Dev - C++ - string vs. stringstream (eficiencia)

   
Vista:

string vs. stringstream (eficiencia)

Publicado por Leo Lucas Ledesma (2 intervenciones) el 10/04/2015 06:48:12
Hace poco se me plantó una pequeña duda que no puedo resolver. A la hora de cargar un texto desde un flujo de entrada, ¿qué es más eficiente en cuanto a memoria? ¿string o stringstream?

Supongamos que tenemos esta función:
1
2
3
4
5
6
7
8
9
10
void cargar_texto( string nombre_archivo, string &texto )  {
	ifstream entrada( nombre_archivo.c_str() );
 
	string str;
 
	while ( getline(entrada,str) ) {
		texto += str + '\n';
	}
 
}

La función recibe el nombre de un archivo y una referencia a string, lee línea por línea desde un flujo y lo carga en el string. Supongo que es uno de los métodos más usados y funciona perfectamente, pero en el caso donde tuvieran que leerse cantidades enormes de líneas de texto habría muchísimas peticiones de memoria.

Cada vez que el string texto tiene que crecer debe pedir más memoria dinámica y luego liberar la que reservó previamente, si el texto se vuelve muy grande este método se vuelve ineficiente... ¿cierto?

Entonces se me ocurrió esto:
1
2
3
4
5
6
7
8
9
10
11
void cargar_texto( string nombre_archivo, string &texto )  {
	ifstream entrada( nombre_archivo.c_str() );
 
	string str; stringstream ss;
 
	while ( getline(entrada,str) ) {
		ss<<str<<'\n';
	}
 
	texto = ss.str();
}

Esta otra función cumple el mismo roll que la anterior, pero ignoro que es lo que está pasando en ese flujo stringstream, por ahí va mi duda, ¿este nuevo algoritmo es más eficiente en cuanto al uso de memoria? ¿es igual o peor?

Espero que alguien más experimentado pueda responder mi duda, desde ya muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

string vs. stringstream (eficiencia)

Publicado por vangodp (287 intervenciones) el 10/04/2015 16:28:15
Hmmm mire esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main () {
    std::string s = "hola mundo";
    int contador = 0;
    std::cout << "En tu sistema dispones de: " << s.max_size()   << std::endl;
    while ( contador < 20 ) {
        std::cout << "\nIteracion numero: " << contador + 1 << std::endl;
        std::cout << "El sistema te reservo: "       << s.capacity()   << std::endl;
        std::cout << "Has utilizado solamente:"       << s.size()       << std::endl;
 
        //std::cout << s << std::endl;
        getchar();
        s += s;
        contador++;
 
    }
 
    std::cin.ignore();
    return 0;
}

Compruebe ese programa y vea que el programa va reservando memoria de forma exponencial a partir de la 10ª iteración más o menos. Eso quiere decir que si vas leyendo cantidades de memoria cada vez mas grande el programa también va aumentando el tamaño de memoria de forma exponencial.

Si vas leyendo cadenas cada vez más grandes la memoria va reservando bocados mayores 16, 32, 64, 128, 256, 512,1024, 2048..... Eso hace que no haya tantas peticiones como tu dices. Será una petición por linea máximo, si la linea es grande también lo es la reserva de memoria y cada vez será mayor hasta alcanzar a s.max_size() o algo antes si la reserva traspasara este valor.

por cierto... el programa va doblando el tamaño del texto hola mundo para forzar la reserva de memoria a cada iteracion ;).

Además deberías mirar eso: http://www.cplusplus.com/reference/string/string/reserve/
Reserva la suficiente memoria para todo el fichero de forma anticipada. XDDD

Mire sus miembros que algo encuentras seguro XDD
http://www.cplusplus.com/reference/string/string/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

string vs. stringstream (eficiencia)

Publicado por Leo Lucas Ledesma (2 intervenciones) el 11/04/2015 05:02:42
Gracias por la prueba, ahora veo que no vale la pena preocuparme por esto ya que la clase string lo resuelve por sí misma.
Conosco el método reserve, pero ignoraba el usar los punteros del flujo fstream en un archivo de texto, he aprendido algo nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar