2016-07-17 4 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がどのように実装されているかは言いません。 1つの行に2つ以上の単語が含まれていない場合は、おそらく配列の代わりに2つのstd :: stringメンバーを持つことで高速にすることができます。

+0

typedef std :: vector tline;あなたのアドバイスは、tlineはstd :: pair になりますか? – Fractale

0

std::experimental::string_view(C++から)アクセス可能であれば、それをbajillion倍速くする必要があります。そうでなければ、何か類似している(開始/終了ポインタの組または開始/長さ)。

また、書いても面倒ですが、私は恐ろしいパフォーマンスを賢明に見ません。

アライメントと長さの保証がありますが、SSEで最適化することはできますが、文字列をビューに置き換えるのは非常に難しく、はるかに難しくなります。

状況がおそらく制限されているため、利益には限りがあります。より高速なディスクを入手してください。

関連する問題