Мне удалось получить следующий результат с Boost.Spirit 2.5:
$ time ./test input
real 0m6.759s
user 0m6.670s
sys 0m0.090s
'input' - это файл, содержащий 500 000 строк, содержащих 10 случайных целых чисел от 0 до 65535 каждая.
Вот код:
#include <vector>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/classic_file_iterator.hpp>
using namespace std;
namespace spirit = boost::spirit;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
typedef vector<int> ragged_matrix_row_type;
typedef vector<ragged_matrix_row_type> ragged_matrix_type;
template <class Iterator>
struct ragged_matrix_grammar : qi::grammar<Iterator, ragged_matrix_type()> {
ragged_matrix_grammar() : ragged_matrix_grammar::base_type(ragged_matrix_) {
ragged_matrix_ %= ragged_matrix_row_ % qi::eol;
ragged_matrix_row_ %= qi::int_ % ascii::space;
}
qi::rule<Iterator, ragged_matrix_type()> ragged_matrix_;
qi::rule<Iterator, ragged_matrix_row_type()> ragged_matrix_row_;
};
int main(int argc, char** argv){
typedef spirit::classic::file_iterator<> ragged_matrix_file_iterator;
ragged_matrix_type result;
ragged_matrix_grammar<ragged_matrix_file_iterator> my_grammar;
ragged_matrix_file_iterator input_it(argv[1]);
qi::parse(input_it, input_it.make_end(), my_grammar, result);
return 0;
}
На этом этапе result
содержит неровную матрицу, что можно подтвердить печатью ее содержимого.В моем случае «рваная матрица» не такая рваная - это прямоугольник 500000 x 10, но это не имеет значения, потому что я уверен, что грамматика верна.Я получил еще лучшие результаты, когда прочитал весь файл в память перед синтаксическим анализом (~ 4 с), но код для этого длиннее, и, как правило, нежелательно копировать большие файлы в память целиком.
Примечание: на моей тестовой машине установлен SSD, поэтому я не знаю, получите ли вы те же цифры, что и я (если только на вашей тестовой машине нет и SSD).
HTH!