Rails-부분적으로 느린 뷰 렌더링을 사용합니까?


16

Rails 3.1.0응용 프로그램에서 성능 문제가 발생했습니다. 이제 AR을 사용하여 쿼리에서 돔 변경을 수행했지만 뷰를 렌더링하는 데 시간이 너무 오래 걸리고 뷰, 루프 등을 여러 부분으로 나눕니다. 뷰와 다른 부분 내에서 동적으로 렌더링됩니다.

그래서 많은 부분을 갖는 것은 나쁜 습관입니까?

뷰 렌더링 시간을 개선하기 위해 부분 수를 줄여야합니까?

감사

답변:


5

동일한 콘텐츠 를 렌더링 할 때 많은 부분 및 단일 뷰 사이의 렌더링 성능 차이가 크지 않다는 것을 알고 있습니다.

분명히 어떤 경우에는 일부만 렌더링하고 다른 경우에는 일부만 렌더링하는 경우 특정 뷰의 렌더링 볼륨을 효과적으로 줄이면 속도가 향상 될 수 있습니다.

다른 한편으로, 나는 그들의 존재를 정당화하기 위해 적어도 두 곳에서 사용해야하는 부분 추상화를 항상 고려했다. 부분 뷰를 사용하는 다른 이유는 동일한 뷰를 렌더링하지만 일부 비즈니스 논리에 따라 다른 부분을로드하려는 경우입니다.

최신 정보:

렌더링 속도에 대한 측정 또는 구체적인 숫자를 제공 할 수 없습니다. 뷰에서 부분을 사용하는 경우 렌더링하기 위해 render 메소드를 호출하므로 두 번째 메소드 호출이 있습니다. 내 대답에서 말했듯이 이것은 거의 아무것도 아니지만 일의 속도를 높이는 데 도움이 될 수 있습니다.

그러나 부분을 제거하여 성능 문제를 해결하는 프로젝트에 대해서는 들어 본 적이 없습니다. 부분은 뷰에 대한 재사용 메커니즘을 제공하고 프로그래머의 관점에서 해당 범위에 사용해야하는 좋은 방법입니다. 그것들은 뷰에서 일반적인 개념에 대한 추상화 여야합니다.

나는 부분적으로 과도하게 사용 된 프로젝트에서 일했다. Rails가 아니라 동일한 MVC 원칙. 상상할 수있는 모든 것에 작은 부분을 사용하면 수십 개가 나기 시작할 때 찾기가 어렵습니다. 입력 내용을 어디에서 수정 하시겠습니까? 보기에서? 부분적으로? 이 부분에 대해 4 개의 부분이 있습니까? ...

하드 리팩토링 후 뷰가 업데이트 될 때마다 불필요한 부분이 제거되었습니다. 그것들은 완전히 사라지지는 않았지만 프로젝트에 잘 정의 된 추상화가 남아 있습니다. 그것들은 여러 뷰에서 형태로 또는 다른 형태로 반복되는 잘 이해되는 요소 (일종의 객체에 대한 트리 또는 특정 목록 유형)를 나타냅니다. 나는 그 부분이있는 나무를 볼 수 있는지 알고 있습니다. 특정 유형의 목록을 볼 때 그 일부가 있음을 알고 있습니다. 나는 그들을 사냥하지 않았습니다.

코드 가독성은 소프트웨어 코드 기반에서 가장 중요한 일입니다.


따라서 기본적으로 실제로 부분이 필요하지 않은 경우 다른 컨트롤러에서 해당 코드를 재사용하지 않으면 동적으로 다시로드됩니다. 부분적으로 사용하지 않아야합니까? 뷰 렌더링 시간이 향상 될까요?
Mr_Nizzle

@ Mr_Nizzle : 귀하의 의견으로 인한 문제를 다루기 위해 답변을 업데이트했습니다. 나는이 확장 설명이 더 이해하기를 바랍니다 ... 나는 대답의 두 번째 단락이 오해 될 수 있음을 깨달았습니다.
Patkos Csaba

고마워요 Code readability. 그게 전부입니다.
Mr_Nizzle

22

나는 두 대답에 동의하지 않습니다. 부분 뷰에서 코드를 부모 뷰 부분에 존재하는 위치에 복사하고 붙여 넣었으며 500 회 반복하면 뷰를 렌더링하는 데 시간이 600ms가 걸립니다. <% = render xyz %>는 제 생각에는 매우 깨졌습니다.

예를 들어, 총 렌더링 시간 :

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

편집

나는 _model 부분 내의 모든 _partials를 건조시키지 않고 ~ 2000ms로 낮추었습니다.이 시점에서 _model 부분을 인덱스로 이동하려고 시도했지만 렌더링 시간에 영향을 미치지 않았으므로 중첩 된 렌더링에 대한 호출이있는 것 같습니다. 그렇습니다.


중첩 된 부분에 대한 흥미로운 발견. 한 부분을 건조하지 않으면 600ms가 감소하고 모든 부분을 건조시키지 않으면 3800ms가 감소 했습니까? 이를위한 데모 앱을 출시 할 수 있습니까?
lulalala

@lulalala 예, 그렇습니다. 죄송합니다. 제 일을 할 수 없었기 때문에 이제 레일즈에서 장고로 옮겨서 더 이상 해당 코드와 접촉하지 않습니다. Wyatt Barnett이 답을 보았을 때 , 실제로 부분적으로 비효율적 인 DB 액세스를 수행하여 건조하지 않은 코드가 어떻게 든 피할 수 있었는지 확실하지 않습니다.
AJP

1
나는 똑같은 것을 발견했다. 부분적으로 코드를 제거하고 뷰를 건조시키지 않으면 성능이 약 450ms 향상되었습니다.
bcackerman

1
HAML 뷰와 함께 Rails를 사용한 경험에서 많은 작은 부분이 렌더링 속도를 크게 느리게합니다. 뷰에서 많은 부분을 렌더링 할 때 가비지 수집뿐만 아니라 모든 부분에 대해 고정 된 오버 헤드가있는 것처럼 보입니다. 50 개 항목으로 구성된 표에 사용 된 부분을 인라인하면 페이지 렌더링이 500ms 감소했습니다.
d4n3

2
Rails 4 : 방금 큰 앱에서 수천 개의 중첩 된 부분을 제거하고 엄청난 속도를 얻었습니다. 숫자가 없지만 예, 성능 문제가있는 경우 중첩 된 부분을 제거하여 도움이되는지 확인하십시오.
Rick Smith

5

난간은 아니지만 부분 뷰는 그 자체로는 문제가되지 않습니다. 오히려, 당신이 약간의 SELECT N + 1을하고있는 것처럼 들립니다. DB 서버의 관점에서 볼 때 펄프에 걸리지 않도록하십시오.


2

평균 약 745ms의 느린 동작이 발생한 Rails 4.2 앱에서 작업 중입니다.

부분 코드에서 코드를 제거하고 기본 템플릿에 배치하면 평균 시간이 25ms 미만입니다.

부분 렌더링을위한 호출 횟수는 29 회였습니다.


2

n + 1 문제없고 모든 데이터베이스가 선행 작업을 수행 하더라도 (예 : 재귀 적 CTE) 중첩 된 부분은 여전히 ​​느립니다. Haml과 Erb는 모두 느리게 보입니다. Rails 5.1.4에서 각 부분에 대해 몇 밀리 초를 보았으며 때로는 더 나쁜 부분이있을 수 있습니다 (가비지 수집에 해당).

이러한 요청 중 하나가 실행되는 동안 부분 이름을 바꾸면 파일을 찾지 못하는 방법에 대한 오류가 즉시 발생합니다. 따라서 Rails는 부분적으로 디스크를 읽고 다시 분석 한 다음 각 반복에 대해 평가합니다. 느려진 것도 당연합니다!


0

중첩 된 부분에서 나타나는 속도 저하는 개발 중에 만 발생합니다. 테스트하려면 프로덕션으로 전환하십시오.


아마도 개발 버전이 상당히 느린 이유에 대해 언급하고 어떤 테스트에 어떤 모드를 사용할 지에 대해 더 미묘한 차이가있을 수 있습니다.
Kain0_0

솔직히 나는 모든 세부 사항을 모른다. 나는 단지 똑같은 문제가 있었고 생산으로 전환했을 때 훨씬 개선되었다는 것을 알았다. Paul Jungwirth가 알았 듯이 부분 및 재분석은 파일이 변경되었을 때 개발 중에 발생합니다.
Zapaf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.