Я обрабатываю действительно большой текстовый файл следующим образом:
class Loader{
template<class READER>
bool loadFile(READER &reader){
/* for each line of the input file */ {
processLine_(line);
}
}
bool processLine_(std::string_view line){
std::vector<std::string> set; // <-- here
std::string buffer; // <-- here
// I can not do set.reserve(),
// because I have no idea how much items I will put.
// do something...
}
void printResult(){
// print aggregated result
}
}
Обработка 143 000 000 записей занимает около 68 минут.
Поэтому я решил провести очень сложную оптимизацию с несколькими std::array
буферы. Результат составил около 62 минут.
Однако код стал очень нечитабельным, поэтому я решил не использовать их в производстве.
Затем я решил провести частичную оптимизацию, например
class Loader{
template<class READER>
bool loadFile(READER &reader);
std::vector<std::string> set; // <-- here
std::string buffer; // <-- here
bool processLine_(std::string_view line){
set.clear();
// do something...
}
void printResult();
}
I надеялся, что это уменьшит операцию mallo c / free (new [] / delete []) из buffer
и из вектора set
. Я понимаю, что строки внутри вектора set
по-прежнему динамически выделяют память.
Однако результат составил 83 минуты.
Примечание. Я ничего не меняю, кроме перемещения set
и buffer
на «классном» уровне. Я использую их только внутри processLine_
метода.
Почему? Местонахождение ссылки?
Единственное объяснение, о котором я думаю, - это то, что некоторые строки должны быть достаточно маленькими и поместиться в SSO, но это звучит маловероятно.
Использование clang с -O3