首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pharo系统优化选项

Pharo系统优化选项
EN

Stack Overflow用户
提问于 2017-02-01 22:48:01
回答 1查看 206关注 0票数 4

我是StackOverflow的新手,在Windows中寻找技巧和帮助调优FERO5.0。

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

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

代码语言:javascript
复制
  | 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,请不要试图再增加零的迭代次数,它花了很长时间,我不得不中断执行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 00:56:34

欢迎来到SO (还有smalltalk标签!)

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

代码语言:javascript
复制
| x |
x := 0.
[1 to: 200000000 * 10 do: [ :i | 
  x := x + 0.2]] timeToRun

你把它拿来比较

代码语言:javascript
复制
| x |
x := 0.
[1 to: 200000000 * 1 do: [ :i | 
  x := x + 0.2]] timeToRun

第一个版本不仅比第二个版本慢一倍的原因是,在第一个版本中,块变量10SmallInteger域移动到LargeInteger域。因此,每当块增加i时,当i超过SmallInteger边界时,这里发生的加法i := i + 1就会涉及LargeInteger算法,这比SmallInteger算法要慢。

LargeInteger算法发生了多少次?好吧,为了计算我们只需要从SmallInteger maxVal中减去200000000 * 10

代码语言:javascript
复制
(200000000 * 10) - SmallInteger maxVal  = 926,258,177

这意味着法老正在对大整数i执行这个数目的操作。

请注意,如果我们有

代码语言:javascript
复制
| x |
x := 0.
[
  10 timesRepeat: [1 to: 200000000 * 1 do: [ :i | x := x + 0.2]]
] timeToRun

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

增编

请不要把上面的解释看作是LargeInteger算法在制药中的表现很差。相反,法罗在提高计算效率方面做得很好。

在场景后面,法老使用原语进行这些操作,同时为程序员提供了一个独特而一致的视图和Integer算法的API。实际上,如果您尝试在另一种方言中执行同样的操作,而不支持LargeInteger,则需要等待更长的时间才能计算结果。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41991288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档