2016-07-17 41 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's。 –

+0

@PedroDavid我使用tline vline; vline.reserve(2); – Fractale

回答

0

最有可能的功能是不是瓶頸,但你在呼喚它1200萬次:-)

一個明顯的改善,具有可變

const char* file_pos = file + pos; 

簡化每一個訪問的事實。你沒有說明如何實施Tline。如果一行不會包含兩個以上的單詞,那麼通過使用兩個std :: string成員而不是一個數組,可以使其更快。

+0

typedef std :: vector tline;你的建議是tline成爲一個std :: pair ? – Fractale

0

std::experimental::string_view如果可以訪問的話,應該使這個速度快了許多倍。如果不是,類似的東西(開始/結束指針對或開始/長度)。

它也很笨拙,但我沒有看到任何可怕的表現明智。

折騰一些對齊/長度保證,你可以SSE優化它,但這將很小,旁邊的字符串替換視圖,並且更難。

任何好處都可能是有限的,因爲這種情況可能是有限的。獲得更快的磁盤。