2012-11-11 7 views
0

데이터베이스에서 약 1000 개의 행을로드 중입니다.많은 익명 함수를 호출하는 것이 왜 느린가요?

테이블을 인쇄하는 클래스가 있습니다.

<% table.rules :date_uzp, lambda { |row| l row.date_uzp if row.date_uzp.present? } %> 
<% table.rules :another_column, lambda { |row| helper_method row } %> 

을 그리고 결국, 난 그냥 = table.print %> <퍼센트 호출하고이 테이블에 대한 HTML을 생성 :보기에서 나는 예를 들어, 거의 각 열에 대해, 몇 가지 규칙을 정의합니다.

왜 테이블을 생성하는 데 특별한 클래스가 필요합니까? 테이블은이 프로젝트에서 정말 구체적입니다. 따라서 DRY의 원칙을 따르기 위해서 수업을 들었습니다.

그러나 거의 모든 열을 처리하고 익명 함수를 호출하면 문제가 발생합니다. 너무 느립니다. (익명 기능은 약 10 000 번 호출됩니다. 알아요. 꽤 많이 있지만 너무 느릴 수는 없습니다.) 페이지는 약 50 초를로드합니다.

어디에 문제가 있습니까? 너는 무엇을 제안 하는가?

+0

당신은 그것을 bechmarked? 왜 람다에 관한 것이지, 내부의 코드 나 클래스가하는 일에 관한 것이 아닙니다. – Anton

+0

lambda를 호출 할 때 줄을 주석 처리하면 페이지로드가 50 초에서 2 초로 줄어 듭니다. –

+0

하지만 현지화,'date_uzp' 호출 (BTW 두 번 수행됨),'helper_method' 또는 ERB보다'람다 '라고 생각하는 이유는 무엇입니까? –

답변

0

익명의 기능은 느린 것이 아닙니다. 느린 기능의 내용입니다.

내가 선호하는 프로파일 링 도구는 ruby-prof, MiniProfiler이며 내장형은 Benchmark.measure입니다.

초기 추측은 다음과 같습니다 O에서 (n)이 2 시간을 실행

  • 비싼 작업, 즉에서 얻을 정말 쉬운 이후 테이블을
  • 날짜 구문 분석을 조작 할 때에. 내 경험으로는 일부 날짜 구문 분석 기능이 빠르지 만 다른 것들은 개가 느릴 수 있습니다 (date_uzp의 사용을 눈치 채 셨습니다. 구체적으로는 확실하지 않고 가능성을 지적했습니다).
  • 1000 개의 개체를로드 한 다음 각 개체에 여러 개의 연관 (esp has-many)을로드합니다. 많은 activerecord 객체를로드하는 것은 정말 느릴 수 있습니다. 특히 힙 크기가 커지면/많은 가비지 수집이 시작됩니다.

편집

좋아, 다른 생각. Lambdas (및 루비의 모든 블록)는 문맥을 유지하기 위해 클로저를 만듭니다. 아마도 람다 (lambdas) 전략으로 많은 양의 객체가 가비지 수집을 못하게 할 수 있습니까? 당신의 코드를 리팩토링하는 방법을 정확히 어떻게 확신 할 수는 없지만. 내가 폐쇄하지 않고 람다를 만드는 방법을 알고있는 유일한 방법은 다음과 같이이다 :

def foo 
    lambda {|row| helper_method row} 
end 

을하지만 코드를 구성하는 더 나은 방법이있을거야.

+0

람다의 내용을 {| row | },로드하는 데 여전히 11 초가 걸립니다. 다른 뭔가 잘못되었습니다 ... –

+0

OK, 다른 생각을 가졌습니다 (답변 편집보기 참조) – Woahdae

관련 문제