2017-02-01 2 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 번 이상 사용되었습니다. 실행 시간이 두 경우 사이에 10 배 이상으로 커지도록 시스템 경계를 맞추는 것 같습니다.

예기치 않은 바람직하지 않은 시스템 동작을 줄일 수 있도록 Pharo 5.0 VM을 미세 조정하는 데 도움이되는 정보가 있습니까?

p.s. 실행 중에 Windows 작업 관리자는 디스크 작업의 변경 내용을보고하지 않았습니다. 거의 모든 실행은 RAM 및 CPU 작업입니다. 그건 그렇고, 당신이 훨씬 더 빠른 PC를 가지고 있지 않다면, 반복 횟수에 또 다른 0을 추가하려고하지 마십시오. 실행을 망쳐야하는 데 너무 오래 걸렸습니다.

답변

5

에 오신 것을 환영합니다 SO (와 스몰 토크 태그에!)

먼저 참고 일시적 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을 증분 할 때마다 iSmallInteger 경계를 넘었을 때 여기에서 발생하는 i := i + 1SmallInteger보다 느린 LargeInteger 산술이 포함됩니다.

그리고 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를 arithmetics가 Pharo의 저조한 실적을 가지고 제안으로 위의 설명을하지 마십시오.반대로 Pharo는 이러한 계산을 효율적으로 수행하는 데 큰 도움이됩니다.

장면 뒤에 Pharo는 이러한 작업을위한 프리미티브를 사용하는 동시에 프로그래머에게 Integer 개의 고유하고 일관된 뷰와 API를 제시합니다. 실제로 LargeInteger에 대한 VM 지원이없는 다른 방언에서 동일한 결과를 얻으려고하면 결과가 계산 될 때까지 더 오래 기다려야합니다.