2017-02-01 5 views
4

私は、StackOverflowの新機能で、Windows環境でのヒントを探してPharo 5.0のチューニングに役立ちます。Pharoシステムのチューニングオプション

私のPCはWindows 10、4GHzでCPU I5-4670K、Pharo 5.0がロードされ実行されているCドライブとしてPlextor 512G SSDを実行しています。

以下は、パフォーマンスと計算精度の両方でPharoの動作を理解するために使用したコードのセットです。

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

は、実行に2分8.281秒かかりました。反復回数から1つのゼロをノックアウトすると、終了までわずか1.762秒しかかかりませんでした。実行時間の10倍以上の反復で70回以上使用されました。私は、実行の時間が2つのケースの間で10倍をはるかに上回るように私はシステムの境界に達したようです。

Pharo 5.0 VMの微調整に役立ちますので、予期しない予期しないシステム動作を減らすことができますか?

p.s.実行中、Windowsタスクマネージャはディスクアクティビティの変更を報告しませんでした。ほとんどすべての実行はRAMとCPUの操作です。ちなみに、PCの速度がはるかに速い場合を除き、反復回数に0を追加しないようにしてください。実行に時間がかかりすぎてしまいました。

答えて

5

は一時的yがここでどんな役割を果たしていないことをSO(とSmalltalkのタグに!)

まずノートへようこそ、私たちはあなた

| 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をインクリメントするたびに、iSmallInteger境界を超えた場合、ここで行われる加算i := i + 1には、SmallIntegerよりも遅いLargeIntegerの演算が含まれます。

そして、LargeInteger演算処理は何回行われますか?ファロが大きな整数iでの操作の数を実行していることを意味

(200000000 * 10) - SmallInteger maxVal = 926,258,177 

:まあ、我々は唯一の200000000 * 10からSmallInteger maxValを減算する必要があることを計算します。私たちが代わりに

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

持っていたならば、我々は一回の反復の程度10倍の速度を費やしているだろうと

注意。


補遺

LargeInteger算術演算は、ファロでのパフォーマンスの低下を持っていることを示唆しているとして、上記の説明を服用しないでください。逆に、Pharoはそのような計算を効率的にする上で大きな仕事をしています。

舞台裏Pharoはこれらの操作にプリミティブを使用し、プログラマにはIntegerのユニシスで一貫したビューとAPIを提示します。実際には、LargeIntegerのVMサポートがない別の方言で同じことを実行しようとすると、結果が計算されるまでにずっと(多く)長く待たなければなりません。

関連する問題