У меня есть программа на C ++, которая считывает данные из двоичного файла, и изначально я хранил данные в std::vector<char*> data
.Я изменил свой код так, что теперь я использую строки вместо char *, чтобы std::vector<std::string> data
.Некоторые изменения, которые я должен был сделать, должны были изменить, например, с strcmp
на compare
.
Однако я видел, что мое время исполнения резко увеличилось.Для примера файла, когда я использовал char *, это заняло 0.38 с, а после преобразования в строку это заняло 1.72 с на моей машине с Linux.Я наблюдал похожую проблему на моей машине с Windows, время выполнения которой увеличилось с 0,59 до 1,05 с.
Я считаю, что эта функция вызывает замедление.Он является частью класса конвертера, обратите внимание на частные переменные, обозначенные _
в конце имени переменной.У меня явно возникают проблемы с памятью, и я застрял между C и C ++ кодом. Я хочу, чтобы это был код C ++, поэтому я обновил код внизу.
Я получаю доступ к ids_
и names_
также много раз в другой функции, поэтому скорость доступа очень высокаважный. Благодаря использованию map
вместо двух отдельных векторов, я смог достичь более высоких скоростей с более стабильным кодом C ++.Спасибо всем!
Пример NewList.Txt
2515 ABC 23.5 32 -99 1875.7 1
1676 XYZ 12.5 31 -97 530.82 2
279 FOO 45.5 31 -96 530.8 3
СТАРЫЙ код:
void converter::updateNewList(){
FILE* NewList;
char lineBuffer[100];
char* id = 0;
char* name = 0;
int l = 0;
int n;
NewList = fopen("NewList.txt","r");
if (NewList == NULL){
std::cerr << "Error in reading NewList.txt\n";
exit(EXIT_FAILURE);
}
while(!feof(NewList)){
fgets (lineBuffer , 100 , NewList); // Read line
l = 0;
while (!isspace(lineBuffer[l])){
l = l + 1;
}
id = new char[l];
switch (l){
case 1:
n = sprintf (id, "%c", lineBuffer[0]);
break;
case 2:
n = sprintf (id, "%c%c", lineBuffer[0], lineBuffer[1]);
break;
case 3:
n = sprintf (id, "%c%c%c", lineBuffer[0], lineBuffer[1], lineBuffer[2]);
break;
case 4:
n = sprintf (id, "%c%c%c%c", lineBuffer[0], lineBuffer[1], lineBuffer[2],lineBuffer[3]);
break;
default:
n = -1;
break;
}
if (n < 0){
std::cerr << "Error in processing ids from NewList.txt\n";
exit(EXIT_FAILURE);
}
l = l + 1;
int s = l;
while (!isspace(lineBuffer[l])){
l = l + 1;
}
name = new char[l-s];
switch (l-s){
case 2:
n = sprintf (name, "%c%c", lineBuffer[s+0], lineBuffer[s+1]);
break;
case 3:
n = sprintf (name, "%c%c%c", lineBuffer[s+0], lineBuffer[s+1], lineBuffer[s+2]);
break;
case 4:
n = sprintf (name, "%c%c%c%c", lineBuffer[s+0], lineBuffer[s+1], lineBuffer[s+2],lineBuffer[s+3]);
break;
default:
n = -1;
break;
}
if (n < 0){
std::cerr << "Error in processing short name from NewList.txt\n";
exit(EXIT_FAILURE);
}
ids_.push_back ( std::string(id) );
names_.push_back(std::string(name));
}
bool isFound = false;
for (unsigned int i = 0; i < siteNames_.size(); i ++) {
isFound = false;
for (unsigned int j = 0; j < names_.size(); j ++) {
if (siteNames_[i].compare(names_[j]) == 0){
isFound = true;
}
}
}
fclose(NewList);
delete [] id;
delete [] name;
}
КОД C ++
void converter::updateNewList(){
std::ifstream NewList ("NewList.txt");
while(NewList.good()){
unsigned int id (0);
std::string name;
// get the ID and name
NewList >> id >> name;
// ignore the rest of the line
NewList.ignore( std::numeric_limits<std::streamsize>::max(), '\n');
info_.insert(std::pair<std::string, unsigned int>(name,id));
}
NewList.close();
}
ОБНОВЛЕНИЕ: Следите за вопросом: Узкое место при сравнении строк и спасибо за очень полезную помощь!Я не буду делать эти ошибки в будущем!