多线程 Java 不会加速
我在Java中实现了一个简单的并行合并排序算法。这会将数组切成相等的部分,并传递它们以由每个线程独立排序。对数组段进行排序后,它们将由单个线程合并。由于没有共享资源,因此在对子列表进行排序时不使用同步。合并结果数组的最后一个线程会等待其他线程完成。
使用两个线程时,性能提升几乎达到 66%。当我使用4个线程时,所花费的时间与2个线程版本没有区别。我使用的是Linux和Intel Core i5。2.6.40.6-0.fc15.i686.PAE
我正在使用unix命令对时间进行基准测试(数组被分配统一的随机整数)。在排序结束时,我正在检查数组排序是否正确(不是并行的)。time
$ echo "100000000" | time -p java mergeSortTest Enter n: [SUCCESS] real 40.73 user 40.86 sys 0.22
$ echo "100000000" | time -p java mergeSortTest Enter n: [SUCCESS] real 26.90 user 49.65 sys 0.48
$ echo "100000000" | time -p java mergeSortTest Enter n: [SUCCESS] real 25.13 user 76.53 sys 0.43
使用 4 个线程时,CPU 使用率约为 80% 到 90%,使用 2 个线程时,CPU 使用率约为 50%,使用单线程时,CPU 使用率约为 25%。
我期望在4线程中运行时会有一些加速。我在任何地方都错了吗?
更新 1
代码如下:http://pastebin.com/9hQPhCa8
更新 2我有一个英特尔酷睿 i5 第二代处理器。
的输出(仅显示内核 0)。cat /proc/cpuinfo | less
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 42 model name : Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz stepping : 7 cpu MHz : 800.000 cache size : 3072 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 x2apic popcnt xsave avx lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid bogomips : 4589.60 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: