在具有 60Gb RAM 的机器上执行顺序算法的效率

Efficiency of sequential algorithm executed on machine with 60Gb RAM

如果与具有 16Gb RAM 的双核机器相比,用 Java 编写的顺序算法在具有 60Gb RAM 和 16 核的机器上执行速度是否更快(在 Eclipse 中)?我预计该算法确实会 运行 更快,但在 Google Compute Engine 和我的笔记本电脑上进行的实验表明这不是事实。如果有人能解释为什么会这样,我将不胜感激。

Java不会自动为你并行化代码,你需要自己做。

有一些像 parallel streams 这样的抽象可以为您提供简洁的并行性,但您的程序的性能仍然受制于 Amdahl's law 。拥有更多内存将有助于启动更多线程和应用并行算法以利用更多内核。

示例:

  • Arrays.sort 是顺序 Dual-Pivot Quicksort 在 O(nlgn ) 时间,它的整体性能由时钟速率决定。

  • Arrays.parallelSort是并行的merge-sort,用的比较多space(所以这里内存很重要),它将数组分成几部分并对每一部分进行排序并合并它们。

但是,为了从多核机器中获益,必须有人编写这种并行排序。

可以自动为您完成的是高度并发和并行的 GC,它会影响程序的整体性能。

您要求的是 sequential algorithm,这显然意味着没有多线程、没有并行性或 multi-processing 参与代码的执行。比方说,代码是:

a = 5;
b = a + 5;
c = b + 5;
...
and so on...

我们无法执行后面的任何一行,因为它们依赖于前面的值。

一个简单的循环,

for i from 1 to 100 increment 1
    a = a + i

必须按顺序执行 100 次,因为这会导致结果不同,因此无法并行化。

此外,由于您没有在代码中使用线程,java 不支持内置的并行性,所以即使代码有点可并行化,您也有机会。

如果是单线程代码,运行 所在的系统对执行时间有一定影响。这是由 IPC 衡量的

https://en.wikipedia.org/wiki/Instructions_per_cycle

你的代码肯定会 运行 在较新的系统上比在 10 年前的系统上更快,但你提到的两台机器的 1 个线程之间的差异可能不够明显。