Неожиданное снижение производительности при использовании std :: vector и std :: string - PullRequest
2 голосов
/ 29 мая 2020

Я обрабатываю действительно большой текстовый файл следующим образом:

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

1 Ответ

0 голосов
/ 30 мая 2020

Я сделал профилирование и обнаружил, что большую часть времени проводит в сторонней библиотеке C.

Я предполагал, что эта библиотека будет очень быстрой, но это не так.

Я все еще озадачен замедлением, но даже если я оптимизирую его, это не будет иметь такого большого значения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...