为什么我的多线程示例所花的时间与无人所花的时间相同?

时间:2019-05-03 12:13:59

标签: c++ multithreading multiple-arguments

我想在我的程序中创建几个线程,并在其中传递多个参数。我发现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。

2 个答案:

答案 0 :(得分:1)

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

您的问题(又称需要在每个线程上运行的代码)很小,以获取任何性能优势。根据一般经验,我不建议尝试并行化运行时间少于几毫秒的任何代码,因为取决于您的操作系统,这可能是启动另一个线程所花费的时间。

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

答案 1 :(得分:0)

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

通常在云上开始需要花费一些时间。 但是,一旦至少执行一次,则无需再花费额外的时间。

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