我是 StackOverflow 的新手,正在寻找提示并帮助在 Windows 环境中调整 Pharo 5.0。

我的 PC 运行 Windows 10,CPU I5-4670K 4 Ghz,Plextor 512G SSD 作为加载和运行 Pharo 5.0 的 C 驱动器。

以下是我用来理解 Pharo 在性能和计算精度方面的行为的一组代码。

  | x y |
  x := 0.
  y := 400000000.
  [1 to: 2000000000 do: [ :i |
      x := x + 0.2]] timeToRun

执行耗时 2 分 8.281 秒。如果我从迭代次数中剔除一个零,则只需 1.762 秒即可完成。执行时间超过 70 次的迭代次数增加了 10 倍。似乎我达到了系统边界,使得执行时间在两种情况之间增长远高于 10 倍。

感谢任何提示并帮助微调 Pharo 5.0 VM,以便我可以减少此类意外和不受欢迎的系统行为?

附言在执行过程中,Windows 任务管理器没有报告磁盘事件的任何变化。几乎所有的执行都是 RAM 和 CPU 操作。顺便说一下,除非你有一个更快的 PC,否则请不要尝试在迭代次数上再添加一个零,它花了很长时间我不得不中断执行。

最佳答案

欢迎来到 SO(以及 smalltalk 标签!)

首先注意临时 y 在这里没有任何作用,因此我们可以将代码片段简化为

| x |
x := 0.
[1 to: 200000000 * 10 do: [ :i |
  x := x + 0.2]] timeToRun

你比较过的
| x |
x := 0.
[1 to: 200000000 * 1 do: [ :i |
  x := x + 0.2]] timeToRun

第一个版本不仅仅是 10 时间比第二个慢的原因是在前者中,块变量 iSmallInteger 域移动到 LargeInteger 域。因此,每次块递增 i 时,当 i 超过 SmallInteger 边界时,这里发生的加法 i := i + 1 涉及 LargeInteger 算法,这比 SmallInteger 算法慢。
LargeInteger 算术发生了多少次?好吧,要计算我们只需要从 SmallInteger maxVal 中减去 200000000 * 10 :
(200000000 * 10) - SmallInteger maxVal  = 926,258,177

这意味着 Pharo 正在对大整数 i 执行该数量的操作。

请注意,如果我们有
| x |
x := 0.
[
  10 timesRepeat: [1 to: 200000000 * 1 do: [ :i | x := x + 0.2]]
] timeToRun

我们将花费大约 10 倍于一次迭代的速度。

附录

请不要将上述解释视为暗示 LargeInteger 算法在 Pharo 中的性能不佳。相反,Pharo 在提高此类计算效率方面做得很好。

在幕后,Pharo 使用原语进行这些操作,同时向程序员展示了 Integer 算法的独特且一致的 View 和 API。事实上,如果你尝试在另一个没有 VM 支持 LargeInteger 的方言中做同样的事情,你将不得不等待很长时间才能计算出结果。

关于performance-testing - Pharo 系统调整选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41991288/

10-11 18:56