2016-11-21 6 views
-1

長時間実行しなければならない機能があります。 この関数が複数のスレッドによって呼び出されたとします。この関数には多くの変数があり、そのほとんどはstd :: stringです。 機能の変数を宣言するための2つの可能な方法があります: の1-複数のスレッドから呼び出されたときに関数変数を宣言する最良の方法は何ですか?

void Test() 
{ 
    std::string s1; s1.reserve(500); 
    std::string s2; s2.reserve(500); 
    std::string s3; s3.reserve(500); 
    std::string s4; s4.reserve(500); 
    std::string s5; s5.reserve(500); 

    for(;;) 
    { 
     s1= Read_from_file(); 
     s2= Read_from_file2(); 
     s3= s1.substr(0,Snaplength); 
     s4= s2.substr(0,Snaplength); 
     s5= s1+ s2; 
     . 
     . 
     .  
    } 

} 

2 -

for(;;) 
    { 
     std::string s1= Read_from_file(); 
     std::string s2= Read_from_file2(); 

     std::string s3= s1.substr(0,Snaplength); 
     std::string s4= s2.substr(0,Snaplength); 
     . 
     . 
     .  
    } 

} 

としては、関数が長時間実行されている必要があり、以前と述べました。

私の関数を多くのスレッドで呼び出す必要がある場合、どのように時間の複雑さが改善されますか?

[Added:] 私の関数を1000000回呼び出す必要があり、できるだけ早くそれをやりたいとします。 1つの可能な方法は、複数のスレッドで関数を実行することですが、Afaikでは、複数のスレッドで関数を実行することによって、より良いパフォーマンスを達成することが常に可能なわけではありません。その場合、スレッドを追加する方がより高速になるでしょうか?

OS = GNU/Linux

+2

C++ 11を使用している場合は、ほぼ確実に2番目のものです。 –

+3

ローカル変数はスレッド間で共有されていないので、私はあなたが何を求めているのか分かりません。 –

答えて

1

時間のアルゴリズムの複雑さには限りがありません。 2番目のバージョン(!)は少し効率的かもしれませんが、私はさまざまな理由でそれを好むでしょう:それは変数の範囲を減らし、カプセル化を改善します。

0

を実際ににしたい場合は、スタックに文字列を作成しないようにしてください。文字列を割り当てると、同期が必要なヒープ割り当てが実行され、処理が遅くなることがあります。

各スレッドで使用するプライベートメモリを事前に割り当てるのが最も速く、可能な限り文字列の代わりにmemcpyなどを使用するのが最も速いでしょう。実際にこれらの文字列、または生データのみが必要ですか?

std::string s1= Read_from_file(); 
    // can be replaced by 
    fread(private_memory_area[thread_number], 1, datasize, file) 

    std::string s3= s1.substr(0,Snaplength); 
    // can be replaced by 
    memcpy(private_memory_area_2[thread_number], private_memory_area[thread_number], Snaplength); 

申し訳ありませんが、これは複雑に思えますが、できるだけ早くできるようにしてください。std :: stringは効率的ではありません。文字列が大きい場合は、このメソッドを使用する価値があります。

関連する問題