我有两个功能相同的函数-从两个排序的数组 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个线程将获得更好的性能。
任何人都可以建议该问题的原因是什么?如果需要,我可以提供更多信息。