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
倍的原因是,在前一个版本中,块变量 i
从 SmallInteger
域移动到 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
的另一种方言中执行相同的操作,您将不得不等待很长时间才能计算出结果。
我是 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
倍的原因是,在前一个版本中,块变量 i
从 SmallInteger
域移动到 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
的另一种方言中执行相同的操作,您将不得不等待很长时间才能计算出结果。