2012-03-03 4 views
0

교수님은 coursera (https://www.coursera.org/saas/)에서 강의를 듣고 있었는데 교수님은 Ruby의 모든 것이 객체이고 모든 메소드 호출이 객체에 send 메소드를 호출하고 일부 매개 변수를 전달한다고 말하고있었습니다. 여기에는 숫자, 배열 및 기타 기본 클래스가 포함됩니다.Ruby 효율성

나는 구글에 가서 효율 벤치 마크 보면서 나는 다음과 같은 발견 http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

는 컴파일 된 언어, 해석보다 빠르다는 것을 충격적인 아니지만을 (루비, 파이썬) 및 Java 사이의 성능 차이 예를 들면 충격적이다.

루비 코드를 컴파일하는 방법 (이 주제를 연구하지는 못했음)이 있더라도 언어의 핵심 "문제"로 인해 효율성 문제가 여전히 남아 있다고 생각합니다. 기본 연산이 너무 무거워서 : 1 + 1은 완료하는 데 더 많은 CPU 사이클을 필요로합니다.

루비가 너무 좋아요. 나는 메타 프로그래밍의 고수준 측면을 좋아하고 이것이 미래가 어디로 향해야하는지 생각하며, 때로는 좀 더 효과적이기 위해 어떤 것을 타협해야 할 때가있다. 나는 어셈블리에서 코드를 최적화하지 않는다. 몇 밀리 초를 절약 할 수 있습니다. 그러나 우리가 C로 1 + 1을 수행 할 때 기본 작업이 수행되는 시간이 기하 급수적으로 증가하지는 않습니다!

제 질문은 어떻게 운영 집중 프로그램을 다루고 있습니까? 우리는 약 1 년 동안 우리가 개발해온 Ruby on Rails 프로젝트를 가지고 있으며, 우리는 지리적 위치 추적과 우선 순위 지정으로 기계 학습을 시작할 시점에 있습니다.

난 당신이 내 문제를 이해하고 의견을보고 보인다 이것은 나쁜 질문하지

+2

루비에서 두 개의 fixnum을 추가하는 데 걸리는 시간은 기하 급수적입니다. 그것은 여전히'O (1)'입니다 (두 개의 bignum을 추가하는 것은'O (log n)'입니다). – sepp2k

+0

Ruby에서 1 + 1은 유형 1을 찾고, Fixnum을 찾고, 조회 테이블에서 + 메소드를 찾아 실행하고 결과를 반환합니다.몇 가지 추가 단계가 필요했는데, 이는 고정 숫자이며 이론적으로는 맞습니다. O (1)입니다. 실질적으로 말하자면, 모든 방법이 그렇게한다면, (벤치 마크에서 보았 듯이) 소비 된 시간은 "기하 급수적으로"증가하고 있습니다. 나는 이론적 인 알고리즘 복잡성과 실제 알고리즘의 복잡성을 구별하는 경향이있다. 버킷 정렬은 http://en.wikipedia.org/wiki/Bucket_sort에서 볼 수 있습니다. – Abdo

+5

아니요, 모든 방법이 그렇게하는 경우 시간 증가는 선형입니다. 메소드 호출을 추가 할 때마다 프로그램의 런타임은 두 배로되지 않습니다. 그것은 지속적으로 증가합니다. 이론과 실생활을 원하는만큼 구별 할 수 있습니다. "지수 적"은 여전히 ​​"큰"의 동의어가 아닙니다. – sepp2k

답변

2

:-) 합리적인 제안을 바랍니다. 유일한 문제는 잘못 사용 된 단어 지수가이지만 설명 된 문제는 실제입니다.

비슷한 루비 사용 패턴을 가지고 있습니다. 루비에서 자연어 처리를 많이하고 있습니다. 여기에는 기계 학습도 포함됩니다. 내가 루비 성능 문제를 극복하기 위해 다음 방법을 사용 루비 인터페이스

  1. 사용 C 라이브러리 때마다 적용합니다. 예 : SVM이나 의사 결정 트리의 Ruby 구현을 사용하지 않을 것입니다. C에서 훨씬 빠른 구현이 가능하기 때문입니다.

  2. C 구현을위한 루비 래퍼를 사용할 수 없다면 직접 작성하십시오. 일반적으로 이것은별로 문제가되지 않습니다 - 나는 C 코드로 Ruby를 풀로 붙이기 위해 RubyInline 젬을 광범위하게 사용합니다.

  3. Patch Ruby 메모리 관리 또는 수동으로 가비지 수집기를 제어합니다.

  4. Ruby 플랫폼으로 을 고려하십시오. 기계 학습 (Weka) 등을위한 빠른 Java 라이브러리에 쉽게 액세스 할 수 있으며 응용 프로그램의 일반적인 성능은 유지되거나 더 좋아질 것입니다.

+0

좋은 계획이 좋습니다. Ruby 코드에 다른 위치에 C 코드가 붙는 것이 지저분하거나 실용적인 것이라고 생각하십니까? 고마워요! :-) – Abdo

+0

기본 아이디어는 모든 C 코드를 멋진 Ruby 인터페이스로 덮고 C 코드베이스를 가능한 작게 유지하는 것입니다. 그것이 나온다면, C 코드와 Ruby 코드가 섞여 있기 때문에 자체 테스트를 통해 별도의 C 라이브러리를 작성하는 것이 좋습니다. 따라서 코드가 훨씬 모듈화되고 유지 관리가 쉬워집니다. –

+0

감사합니다, 알렉산더! – Abdo