2011-12-18 3 views
1

필자는 항상 1.9.x가 REE보다 빠르지 만 더 많은 메모리를 소비한다고 생각했습니다. 그러나 최근에 나와 지적했듯이 REE는 RSpec 사양을 실행하는 것보다 실제로 빠르며 큰 차이가 있습니다. RSpec을 실행할 때 REE가 1.9.3보다 빠른 이유는 무엇입니까?

$ rvm use ree 
$ rvm gemset create sandbox 
$ rvm gemset use sandbox 
$ gem install rspec 

$ time rspec foo_spec.rb 
No examples found. 

Finished in 0.07346 seconds 
0 examples, 0 failures 

real 0m0.104s 
user 0m0.059s 
sys 0m0.015s 

및 1.9.3와 같은 일을하고 이후

, 나는 빈 사양 파일에서만 rspec 및 실행을 포함, 빈 gemset으로 두 배의

$ time rspec foo_spec.rb 
No examples found. 

Finished in 0.13922 seconds 
0 examples, 0 failures 

real 0m0.208s 
user 0m0.122s 
sys 0m0.022s 

을 얻고있다. 여러 개의 보석을 포함하는 보석 세트에서 더 큰 차이를 보았습니다.

왜 이런 일이 일어나고 있습니까? 1.9.3이 현재 사용할 수있는 가장 빠른 버전이 아닌 이유는 무엇입니까?

OS X Lion의 RVM을 통해 설치된 최신 버전을 실행하고 있습니다.

+2

유용한 작업에서 실제 속도가 아니라 시작 시간 만 측정합니다. 대신 유용한 벤치 마크 결과를 얻기 위해 코드와 일치하는 좀 더 복잡한 것을 선택하십시오. –

+0

또한 파일 시스템 캐싱에주의하십시오. 더 정확한 결과를 얻으려면 각 테스트를 20 회 연속 실행하고 마지막 15 회 실행의 중앙값을 취하십시오. – phs

+0

@phs yes 파일 시스템 캐싱에 대해 알고 있지만 파일을 바꿀 때 다시 실행하기 때문에 테스트가 처음 실행될 때 문제가 발생합니다. –

답변

5

정말 벤치에 따라 다릅니다. 당신이 그 것처럼 간단하다면 그것은 내 의견으로 간주조차하지 않습니다. 그래서, 여기에 많은 파일을 "require"하고 실제적인 많은 spec을 실행하는 나의 Backup gem의 예가 있습니다. 특정 패치가 그 변화를 만든 이후

루비 엔터프라이즈 에디션

time bundle exec rspec spec 

real 0m5.579s 
user 0m3.427s 
sys 0m0.465s 

502 examples, 0 failures 

루비 1.9.3p0

bundle exec rspec spec 

real 0m3.863s 
user 0m3.552s 
sys 0m0.299s 

502 examples, 0 failures 

시동 시간이 1.9.3p0로 일반적으로 빠르다 파일의 알고리즘은 함수를 필요로합니다.이 함수는 평균 루비 온 레일즈 애플리케이션의 크기와 비슷한 앱의 평균로드 시간을 약 30 % 줄였습니다. 그러나 초기에로드 된 파일이 거의없고 프로세스가 오래 실행되지 않으면 속도가 느려질 수 있습니다.

1

GC 성능 튜닝의 결과가 실제로 REE의 장점 인 것으로 추측됩니다 (REE와 1.9.3 모두에서 대규모 Rails 앱을 사용한 실제 벤치마킹에 기반 함).

벤치 마크에서 GC 오버 헤드를 제거하여 실제로 사과와 사과를 비교하므로 프로세스에서 가능한 한 빨리 비활성화하십시오. 물론

GC.disable

당신이 GC를 호출하지 않고 모든 테스트를 실행하기에 충분한 메모리가있는 경우, 당신은 단지 유용한 결과를 얻을 수 있습니다; 당신은 다음과 같은 것을 할 수 컴퓨터가 스와핑을 시작하면 결과가 유용하지 않습니다.

+0

GC를 반드시 켜야합니다. 사양을 실행하기 전에 실행 해보십시오. export RUBY_HEAP_MIN_SLOTS = 600000 && export RUBY_GC_MALLOC_LIMIT = 59000000 && export RUBY_FREE_MIN = 200000 – Michael