为什么我的多线程示例与 none 示例花费的时间相同?
Why my multithreading example takes the same amount of time as the none one?
我想在传递多个参数的程序中创建几个线程。我找到了 this 示例,其中显示您可以避免结构并将多个参数传递给线程。有效。或者我是这么想的。当我查看我的函数的持续时间时,它们花费了相同的时间。
我是 运行 我在亚马逊服务器上的代码,所以我不确定是服务器问题还是我的代码问题。
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。
运行 您在本地机器上的代码,并检查时间。
运行 亚马逊服务器上的相同代码并再次检查时间。
通常在云上开始需要一些时间。
但是一旦它至少执行了一次,那么它不应该再次花费额外的时间。
通过多次执行您的线程函数来检查时间。
多线程不是免费的。每次生成线程时,都会有一些初始化开销。此外,拥有多个线程意味着操作系统需要管理它们,因此从一个线程切换到另一个线程也不是免费的。
您的问题(也就是每个线程上需要 运行 的代码)太小了,无法获得任何性能优势。作为一般经验法则,我不建议尝试将任何花费少于几毫秒的代码并行化到 运行,因为根据您的操作系统,启动另一个线程所花费的时间可能是这样。
您遇到的第二个问题是 clock()
的用法。它考虑了 运行 执行程序所花费的时间,而不是自程序开始以来经过的时间。这是完全不同的,因为计算机永远不会 运行 同时运行一个程序。为了解决这个问题,我建议查看 QueryPerformanceCounter
(仅 Windows)。在某处可能还有其他更通用的功能...
我想在传递多个参数的程序中创建几个线程。我找到了 this 示例,其中显示您可以避免结构并将多个参数传递给线程。有效。或者我是这么想的。当我查看我的函数的持续时间时,它们花费了相同的时间。
我是 运行 我在亚马逊服务器上的代码,所以我不确定是服务器问题还是我的代码问题。
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。
运行 您在本地机器上的代码,并检查时间。 运行 亚马逊服务器上的相同代码并再次检查时间。
通常在云上开始需要一些时间。 但是一旦它至少执行了一次,那么它不应该再次花费额外的时间。
通过多次执行您的线程函数来检查时间。
多线程不是免费的。每次生成线程时,都会有一些初始化开销。此外,拥有多个线程意味着操作系统需要管理它们,因此从一个线程切换到另一个线程也不是免费的。
您的问题(也就是每个线程上需要 运行 的代码)太小了,无法获得任何性能优势。作为一般经验法则,我不建议尝试将任何花费少于几毫秒的代码并行化到 运行,因为根据您的操作系统,启动另一个线程所花费的时间可能是这样。
您遇到的第二个问题是 clock()
的用法。它考虑了 运行 执行程序所花费的时间,而不是自程序开始以来经过的时间。这是完全不同的,因为计算机永远不会 运行 同时运行一个程序。为了解决这个问题,我建议查看 QueryPerformanceCounter
(仅 Windows)。在某处可能还有其他更通用的功能...