QDataStream vs. ifstream
Verfasst: 3. Juli 2006 11:23
Hallo zusammen,
Ich habe festgestellt, dass ein QDataStream zum Einlesen einer 16MB Datei ca. 10 min. braucht während der c++ - ifstream nur 8.5 Sec benötigt.
Mache ich hier etwas falsch oder ist das tatsächlich so? Im Prinzip würde ich lieber auf die Qt-Klassen als auf die c++ Klassen zurückgreifen (wg. garantierter Plattformunabängigkeit).
Hier der relevante Code:
Mit QDataStream:
Mit ifstream
Gruß,
Eric
Ich habe festgestellt, dass ein QDataStream zum Einlesen einer 16MB Datei ca. 10 min. braucht während der c++ - ifstream nur 8.5 Sec benötigt.
Mache ich hier etwas falsch oder ist das tatsächlich so? Im Prinzip würde ich lieber auf die Qt-Klassen als auf die c++ Klassen zurückgreifen (wg. garantierter Plattformunabängigkeit).
Hier der relevante Code:
Mit QDataStream:
Code: Alles auswählen
QFile file (filename);
if (!file.open(QIODevice::ReadOnly)) return;
QDataStream in(&file);
in.setByteOrder(QDataStream::LittleEndian);
// Calculate size:
const unsigned int DATASIZE = m_width*m_height*m_depth;
// Allocate data
quint8 *data = new quint8 [DATASIZE];
for (unsigned int i = 0; i < DATASIZE; ++i)
{
// read data
in >> data[i];
// Alternativ auch:
// in.readRawData(reinterpret_cast<char *>(&data[i]),1);
// gleich schlechtes zeitliches Resultat
}
Code: Alles auswählen
filename.replace(QRegExp("\\"),"\\\\");
std::string s = filename.toStdString();
const char* fn = s.data();
std::ifstream quelle(fn, std::ifstream::in | std::ifstream::binary);
if (!quelle)
{
QMessageBox::critical(0, QObject::tr("Error"), QObject::tr("File could not be opened"), QMessageBox::Ok, QMessageBox::NoButton);
return;
}
// Calculate size:
const unsigned int DATASIZE = m_width*m_height*m_depth;
// Allocate data
qint8 *data = new qint8 [DATASIZE];
for (unsigned int i = 0; i < DATASIZE; ++i)
{
quelle.read(reinterpret_cast<char *>(&data[i]),1);
}
// ******* Closing Source File
quelle.close();
Eric