Ich lese eine Datei und speichern Sie die Daten in eine vector
. Ich kann arrays
nicht verwenden, da die Datengröße nicht festgelegt ist. Die Dateigröße beträgt ca. 300kb und könnte bis zu 600kb betragen. Derzeit dauert das Lesen/Speichern etwa 5 - 8 Sekunden.Langsame Datei lesen und in den Speicher kopieren - C++
Ich würde gerne wissen, was verlangsamt meine Lese-/Kopier-Methode und wie es verbessert werden könnte?
Probendaten:
0000: 4000 94 45 30 39 36 39 74 00 00 00 00 50 00 00 00 27 einige andere Informationen hier
int SomeClass::Open()
{
vector <unsigned int> memory; // where the data will be stored
file.open("c:\\file.txt",ios::in);
regex addressPattern("0000:(\\d|[a-z]){4}"); // used to extract the address from a string
regex dataPattern("((\\d|[a-z]){2}){16}"); // used to extract the data from a string
smatch match;
string str; // where each line will be stored
string data; // where the data found in each line will be stored
int firstAddress = -1; // -1 = address not been found
unsigned int sector = 0;
unsigned int address = 0;
while(getline(file,str)){
if(regex_search(str,match,addressPattern) && firstAddress == -1){
sector = std::stoul(match.str().substr(0,3),nullptr,16);
address = std::stoul(match.str().substr(5),nullptr,16);
firstAddress = address;
}
if(regex_search(str,match,dataPattern)){
std::istringstream stream(str);
string data; // used to store individual byte from dataString
while(stream >> data){
unsigned int c = std::stoul(data,nullptr,16); // convertion from hex to dec
memory.insert(memory.end(),c);
}
}
}
return 0;
}
Höchstwahrscheinlich 'regex', das Ihre Leistung zunichte macht: http://stackoverflow.com/questions/20 942450/why-c11-regex-libc-implementation-is-so-langsam – Steephen
ist es besser, die einfachste Aussage (in Bezug auf die Berechnung) von if operator auf den ersten Platz im Falle von '&&' Ich weiß nicht, wie oft 'firstAddress == -1', aber wenn es nicht ist, wird' regex_search (...) 'nicht ausgeführt. – segevara
Das Datenformat ist einfach. Verwenden Sie nicht 'Regex'. Außerdem sollten Sie die Größe Ihrer Daten schätzen und Umplatzierungen vermeiden: Verwenden Sie 'vector :: reserve'. – ZDF