我想在我的程序中创建几个线程,并在其中传递多个参数。我发现this的示例表明可以避免使用结构并将多个参数传递给线程。有效。还是我想。当我查看功能的持续时间时,它们花费的时间相同。
我在Amazon服务器上运行我的代码,因此不确定问题出在服务器还是我的代码。
EDIT 我添加了可执行代码,并在本地计算机上运行了该代码。它似乎没有显示出良好的结果。
#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>
#include "time.h"
using namespace std;
void threadCallback(float &number)
{
sleep(10);
number = 10;
}
int main()
{
clock_t begin = clock();
for(int j = 0; j < 2; j++)
{
float fitness = 0;
threadCallback(fitness);
}
double duration = double(clock()-begin)/CLOCKS_PER_SEC;
std::cout << "Original duration \t\t\t" << duration << endl;
clock_t begin1 = clock();
float fitness1 = 0;
std::thread th1(threadCallback, std::ref(fitness1));
float fitness2 = 0;
std::thread th2(threadCallback, std::ref(fitness2));
th1.join();
th2.join();
double duration1 = double(clock()-begin1)/CLOCKS_PER_SEC;
cout << "My duration \t\t\t" << duration1 << endl;
return 0;
}
如果遇到任何问题,我将不胜感激。
我得到的持续时间分别是:0,000095和0,000297。
答案 0 :(得分:1)
多线程不是免费的。每次生成线程时,都会有一些初始化开销。另外,拥有多个线程意味着操作系统需要对其进行管理,因此从一个线程切换到另一个线程也不是免费的。
您的问题(又称需要在每个线程上运行的代码)很小,以获取任何性能优势。根据一般经验,我不建议尝试并行化运行时间少于几毫秒的任何代码,因为取决于您的操作系统,这可能是启动另一个线程所花费的时间。
您遇到的第二个问题是使用clock()
。它考虑了运行程序所花费的时间,而不是自程序开始以来所花费的时间。这完全不同,因为计算机永远不会一次运行一个程序。为了解决这个问题,我建议您查看QueryPerformanceCounter
(仅Windows)。可能还有其他更通用的功能……
答案 1 :(得分:0)
在本地计算机上运行代码,然后检查时间。 并在亚马逊服务器上运行相同的代码,然后再次检查时间。
通常在云上开始需要花费一些时间。 但是,一旦至少执行一次,则无需再花费额外的时间。
通过多次执行线程函数来检查时间。