在多个线程调用时声明函数变量的最佳方法是什么?

时间:2016-11-21 08:02:16

标签: c++ multithreading operating-system

有一项功能必须长时间运行。 假设该函数由多个线程调用。该函数有许多变量,其中大多数是std :: string。 声明函数变量有两种可能的方法:  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);
        .
        .
        .       
    }

 }

如前所述,该功能必须运行很长时间。

当我需要通过多个线程调用我的函数时,哪种方式在时间复杂度方面更好?

[添加了:] 假设我需要调用我的函数100万次,并希望尽快完成。一种可能的方法是通过多个线程运行该函数,但Afaik,通过多线程运行该函数并不总是能够实现更好的性能。在这种情况下添加线程可能会更快?

OS = GNU / Linux

2 个答案:

答案 0 :(得分:1)

就算法的复杂性而言,没有区别;第二个版本可能(!)更有效率,但我更喜欢它的原因不同:它减少了变量的范围,从而改善了封装。

答案 1 :(得分: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);

很抱歉,如果这看起来很复杂,但你要求它尽可能快#34;并且std :: string根本不高效。如果字符串很大,那么使用这种方法是值得的。