使用多个线程时的性能问题

时间:2019-06-29 12:57:06

标签: java multithreading

我有两个功能相同的函数-从两个排序的数组 A B 中,返回具有所有数字的第三个数组 C 高于中位数。我必须对这两个功能执行基准测试,以查看谁更好,然后将其添加到第一个线程中并再次检查。

第一个功能更快。当我尝试使用多个线程(在第一个线程中)时,我意识到当我使用较少的线程(例如4个)时性能会下降,而当我使用单个线程时会更好(将工作平均分配给所有四个线程)。起初,我虽然与高速缓存未命中的问题有关(由于有多个线程),所以我试图将数组设置为更大的大小(百万),但这种情况仍然发生。

第一个功能

public static int[] bigThanMedianAlgo(int []a, int []b)
{
    int [] ans = new int[a.length];
    int num_threads = 4;
    Thread [] threads = new Thread[num_threads];

    long start_time = System.currentTimeMillis();

    for (int i = 0; i < threads.length; i++)
    {
        threads[i] = new WorkerThread(a,b,ans, (ans.length/num_threads)*i, (ans.length/num_threads)*(i+1));
        threads[i].start();
    }

    for (int i = 0; i < threads.length; i++)
    {
        try {
            threads[i].join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    long estimated_time = System.currentTimeMillis() - start_time;
    System.out.println("Run time: worker threads " + estimated_time + "ms");

    return ans;
}

第二个功能

public static int[] bigThanMedianMerge(int[]a, int[] b)
{
    int [] ans = new int[a.length];

    long start_time = System.currentTimeMillis();

    for(int i = a.length-1, j = b.length-1, r = 0; r < ans.length; r++)
    {
        if(a[i] > b[j])
        {
            ans[r] = a[i--];
        }
        else
        {
            ans[r] = b[j--];
        }
    }

    long estimated_time = System.currentTimeMillis() - start_time;

    System.out.println("Run time: Regular merge " + estimated_time + "ms");
    return ans;
}

WorkerThread的运行方法:

public void run()
{
    for (int i = start; i < end; i++) 
    {
        c[i] = Math.max(a[i], b[a.length - i - 1]);
    }
}

这些是数组大小为1500万个项目和4个线程的结果:
运行时间:常规合并63毫秒
运行时间:工作线程24ms

这些是数组大小为1500万个项目和1个线程的结果:
运行时间:常规合并63毫秒
运行时间:工作线程17ms

在两次执行之间我唯一改变的是变量 num_threads
我的计算机具有Intel i5-8400 CPU(6核),我预计4个线程将获得更好的性能。

任何人都可以建议该问题的原因是什么?如果需要,我可以提供更多信息。

0 个答案:

没有答案