-2

我想在我的程序中创建几个线程,在其中传递多个参数。我发现了这个例子,它表明你可以避免使用结构并将多个参数传递给一个线程。有效。或者我是这么想的。当我查看我的函数的持续时间时,它们花费了相同的时间。

我在亚马逊服务器上运行我的代码,所以我不确定问题出在服务器还是我的代码上。

编辑我添加了可执行代码并在我的本地机器上运行它。它似乎没有显示出好的结果。

    #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。

4

2 回答 2

1

多线程不是免费的。每次生成线程时,都会产生一些初始化开销。此外,拥有多个线程意味着操作系统需要管理它们,因此从一个线程切换到另一个线程也不是免费的。

您的问题(也就是需要在每个线程上运行的代码)对于获得任何性能优势来说太小了。作为一般经验法则,我不建议尝试并行化任何运行时间少于几毫秒的代码,因为根据您的操作系统,这可能是启动另一个线程所需的时间。

您遇到的第二个问题是使用clock(). 它考虑了运行程序所花费的时间,而不是自程序开始以来经过的时间。这是完全不同的,因为计算机永远不会同时运行一个程序。为了解决这个问题,我建议查看QueryPerformanceCounter(仅适用于 Windows)。可能还有其他更通用的功能在某处可用......

于 2019-05-03T14:17:30.640 回答
0

在本地机器上运行您的代码,并检查时间。并在亚马逊服务器上运行相同的代码并再次检查时间。

通常在云上,最初需要一些时间才能开始。但是一旦它至少执行一次,那么它不应该再次花费额外的时间。

通过多次执行你的线程函数来检查时间。

于 2019-05-03T12:35:13.380 回答