我是StackOverflow的新手,在Windows中寻找技巧和帮助调优FERO5.0。
我的PC正在运行Windows 10,CPU I5-4670K在4 Ghz,Plextor 512 g SSD作为C驱动器加载和运行法老5.0。
下面是一组代码,我用它来理解法老在性能和计算精度方面的行为。
| x y |
x := 0.
y := 400000000.
[1 to: 2000000000 do: [ :i |
x := x + 0.2]] timeToRun执行了2分8.281秒。如果我从迭代次数中减去一个零,它只需要1.762秒就能完成。在执行时间中,10倍以上的迭代使用超过70次。我似乎碰到了一个系统边界,在这两种情况下,执行时间增长了10倍以上。
欣赏任何技巧,并帮助微调法老5.0虚拟机,以便我可以减少这种意外的和不受欢迎的系统行为?
附注:在执行过程中,Windows任务管理器没有报告磁盘活动的任何更改。几乎所有的执行都是RAM和CPU操作。顺便说一句,除非你有一个更快的PC,请不要试图再增加零的迭代次数,它花了很长时间,我不得不中断执行。
发布于 2017-02-02 00:56:34
欢迎来到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从SmallInteger域移动到LargeInteger域。因此,每当块增加i时,当i超过SmallInteger边界时,这里发生的加法i := i + 1就会涉及LargeInteger算法,这比SmallInteger算法要慢。
LargeInteger算法发生了多少次?好吧,为了计算我们只需要从SmallInteger maxVal中减去200000000 * 10
(200000000 * 10) - SmallInteger maxVal = 926,258,177这意味着法老正在对大整数i执行这个数目的操作。
请注意,如果我们有
| x |
x := 0.
[
10 timesRepeat: [1 to: 200000000 * 1 do: [ :i | x := x + 0.2]]
] timeToRun我们将花费大约一次迭代速度的10倍。
增编
请不要把上面的解释看作是LargeInteger算法在制药中的表现很差。相反,法罗在提高计算效率方面做得很好。
在场景后面,法老使用原语进行这些操作,同时为程序员提供了一个独特而一致的视图和Integer算法的API。实际上,如果您尝试在另一种方言中执行同样的操作,而不支持LargeInteger,则需要等待更长的时间才能计算结果。
https://stackoverflow.com/questions/41991288
复制相似问题