2016-07-17 10 views
0

Я написал программу, и у меня проблема с производительностью.Узкое место и неправильный код стиля

Узкое эта функция:

void getlinesplit(const char *file, unsigned int &pos, tline &vline) 
{ 
    vline.clear(); 

    unsigned int debut_du_mot = 0; 
    unsigned int i = 0; 
    while (file[pos+i] != '\n') 
    { 
     if (file[pos+i] == '\t') 
     { 
      vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot)); 
      debut_du_mot = i+1; 
     } 
     ++i; 
    } 
    vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot)); 
    pos = pos + i+1; 
} 

Эта функция называется 11 988 400 раз.

vline - это один и тот же вектор строки, чтобы избежать создания и уничтожения вектора.

Как я могу улучшить эту функцию?

PS: Линия состоит из 1 или 2 слов максимум.

+0

Профите это, я делаю ставку в функции push_back. Вы инициализируете свой вектор с любым размером или используете ли вы по умолчанию? Если вы используете по умолчанию, там должно быть много изменений (и, следовательно, перераспределение) –

+0

Возможно, вы можете посмотреть, откуда это вызывается, и выбрать лучший интерфейс. Возможно, тот, который не связан с построением 'std :: string'. –

+0

@PedroDavid Я использую tline vline; vline.reserve (2); – Fractale

ответ

0

Скорее всего, функция не является узким местом, но тот факт, что вы вызываете его 12 миллионов раз :-)

Очевидное улучшение, имеющий переменную

const char* file_pos = file + pos; 

упрощает каждый доступ. Вы не говорите, как работает tline; если строка никогда не содержит более двух слов, то вы, вероятно, можете сделать ее быстрее, имея два элемента std :: string вместо массива.

+0

typedef std :: vector tline; ваш совет tline станет std :: pair ? – Fractale

0

std::experimental::string_view от C++ 17, если доступный должен сделать это на миллиард раз быстрее. Если нет, что-то подобное (пары начала/конца указателя или начало/длина).

Это также неловко написано, но я не вижу ничего ужасного в работе.

Бросок в некоторых целях выравнивания/длины, и вы можете SSE оптимизировать его, но это было бы крошечным рядом с заменой строк с видами и намного сложнее.

Любое пособие, вероятно, будет ограничено, так как ситуация, вероятно, связана с io-bound. Получите более быстрый диск.