Valgrind callgrind очень медленно с регулярным выражением C++

У меня есть приложение, которое строго использует Boost для регулярных выражений. Я обновил до g++4.9 и переключил некоторые, но не весь код на использование встроенных функций регулярных выражений (прямое изменение). После переключения я попытался использовать функциональность valgrind --callgrind для профилирования приложения. Но это очень медленно. Хотя это относится к моему приложению, оно увеличилось с 30 итераций в секунду до менее 1 в секунду. Я проверил с / без запуска Valgrind, чтобы убедиться, что это не само приложение. Я также протестировал с реализацией Boost и не было никаких проблем.

Я тестировал с Valgrind 3.10.0 и 3.10.1, и оба демонстрируют одинаковое поведение.

Редактировать: упрощенная версия функции, которую я заменил. При сходстве синтаксиса Boost и C++ две функции практически идентичны, за исключением пространств имен (Boost:: v. Std::).

void func() {
    ifstream fin;
    fin.open("file1");

    string check;
    stringstream ss (stringstream::in | stringstream::out);
    ss << "Some complicated regex";
    getline(ss, check);
    regex replacementRecord(check);

    smatch results;

    regex pattern1("thing1");

    while(!fin.eof()) {
        string line;
        getline(fin, line);
        // skip blank or newline
        if (line == "" || line == "\n") {
            continue;
        }

        // Check for these important patterns first
        if (regex_search(line, results, pattern1)) {
            // do stuff
            continue;
        } 

        // No important patters, look for this replacementRecod
        if(regex_search(line, results, replacementRecord)) {
            string prefix(results[1].first, results[1].second);
            // do stuff
        }
        else {
            // do other stuff
        }
    }
    fin.close();
}

0 ответов

Другие вопросы по тегам