Pharo 系统调整选项

Pharo System Tuning Options

我是 Whosebug 的新手,正在寻找技巧并帮助在 Windows 环境中调整 Pharo 5.0。

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

以下是我用来了解 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,以便我可以减少此类意外和不良的系统行为?

p.s。在执行期间,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 运算发生了多少次?那么,要计算我们只需要从 200000000 * 10:

中减去 SmallInteger maxVal
(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 使用原语进行这些操作,同时向程序员提供独特且一致的视图和 API 的 Integer 算术。事实上,如果您尝试在不支持 VM LargeInteger 的另一种方言中执行相同的操作,您将不得不等待很长时间才能计算出结果。