有一项功能必须长时间运行。 假设该函数由多个线程调用。该函数有许多变量,其中大多数是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
答案 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根本不高效。如果字符串很大,那么使用这种方法是值得的。