Estaba ejecutando algunos benchmarks para encontrar la manera más eficiente de escribir una gran matriz en un archivo en C++ (más de 1Go en ASCII).Perforaciones muy sorprendentes de fprintf vs std :: ofstream (fprintf es muy lento)
Por lo tanto, en comparación con std :: ofstream fprintf (véase el interruptor utilicé más adelante)
case 0: {
std::ofstream out(title, std::ios::out | std::ios::trunc);
if (out) {
ok = true;
for (i=0; i<M; i++) {
for (j=0; j<N; j++) {
out<<A[i][j]<<" ";
}
out<<"\n";
}
out.close();
} else {
std::cout<<"Error with file : "<<title<<"\n";
}
break;
}
case 1: {
FILE *out = fopen(title.c_str(), "w");
if (out!=NULL) {
ok = true;
for (i=0; i<M; i++) {
for (j=0; j<N; j++) {
fprintf(out, "%d ", A[i][j]);
}
fprintf(out, "\n");
}
fclose(out);
} else {
std::cout<<"Error with file : "<<title<<"\n";
}
break;
}
Y mi gran problema es que fprintf parece ser más thant 12x más lento en comparación con std :: ofstream. ¿Tiene una idea de cuál es el origen del problema en mi código? O tal vez std :: ofstream está muy optimizado en comparación con fprintf?
(y otro pregunta: ¿Cómo sabe otra manera más rápida de escribir un archivo)
Muchas gracias
(detalle: yo estaba compilando con g ++ -Wall -O3)
creo que debería usar fputs en lugar de fprintf para obtener un comportamiento más similar –
también consulte 'ostream :: write()': http://www.cplusplus.com/reference/iostream/ostream/write/ – Nim
@ AndersK .: No. fputs es el equivalente de un streambuf (no formateado); fprintf es la contraparte adecuada de ostream. – MSalters