2011-12-13 3 views
15

시간 프로파일 러는 앱에서 시간이 많이 걸리는 작업이 nib 파일에서 UITableViewCells을로드하고 있음을 보여줍니다. 가장 비싼 것은 UITableViewCell에 4KB 이미지를로드하는 것입니다.프로그래밍 방식으로 UITableViewCell을 만들거나 펜촉에서로드하는 것이 더 빠릅니까?

나는 다음과 같은 코드로 펜촉에서 UITableViewCell로드 오전 :

[[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

사람이 프로그래밍 방식으로보기를 만들거나 펜촉에서 UITableViewCell로드의 차이를 비교 했습니까?

편집 :
나는 펜에서부터 UITableViewCell을로드하고 프로그래밍 방식으로보기를 만드는 반복 실행의 시간 프로필을 비교했습니다. 내 검사는 2 ~ 3 초 사이에 약 10 번 약 두 번을 번갈아 수행했습니다. 각 테스트에서 프로그래밍 방식으로 UITableViewCell을로드하는 속도는 2 배에서 6 배 빨라진 속도보다 훨씬 빨랐습니다.

누구든지이 결과를 확인할 수 있습니까?

EDIT : nib 파일을 한 번만로드하고 후속 호출에 캐시 된 버전을 사용하도록 nib로드 코드를 업데이트했습니다.

if (self.UITableViewPortaitNib == nil) { 
     self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]]; 
    } 

    self.UITableViewPortaitNib instantiateWithOwner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

은 또한 더 일관된 실행을 만들기 위해 자동화 기기를 사용하고 결과는 여전히로드 UITableViewCells 프로그래밍 펜촉에 대한 UITableViewCells를로드보다 빠릅니다 좋습니다. 펜촉에서로드 한 UITableViewCells의 평균 실행 시간은 프로그래밍 방식으로 UITableViewCell을 생성하는 평균 실행 시간은 프로그래밍 방식으로 50ms 였지만 약 90ms였습니다.

+0

귀하의 펜촉로드 코드를 알려주십시오. –

+0

@robmayoff를 이용해 주셔서 감사합니다. 펜촉을로드하는 코드를 포함하도록 질문을 업데이트했습니다. – Eytan

+0

재미있는 찾기 - 스토리 보드와 프로토 타입 셀을 사용하여 실험을 다시 실행할 수 있습니까? 테이블보기는 백그라운드에서 모든 펜촉을로드합니다. – jrturton

답변

13

UINib 개체를 한 번 만든 다음 새 셀을 만들어야 할 때마다 instantiateWithOwner:options:으로 보내보십시오. UINib Class Reference에서 :

예를 들어, 테이블 뷰가 상당한 성능 향상을 제공 할 수있는 UINib 객체의 펜촉을 캐싱, 테이블 뷰 셀을 인스턴스화하는 nib 파일을 사용하는 경우.

+0

많은 도움이되는 와우! 당신이 언급 한 기술을 사용하여 NIB에서 로딩 할 때 평균 실행 시간 (theists의 기간 동안)은 약 300ms에서 90ms로 떨어졌습니다. 프로그래밍 방식으로로드하는 경우 평균 실행 시간은 약 50 밀리 초입니다. – Eytan

2

는 한번은 펜촉 셀 (cellTemplate)을로드하고 의미에서이 방법을 기반으로 모두 프로그래밍 펜촉이 있으므로, 필요에 따라 중복.

복제가 예상보다 복잡했습니다. mutableCopy이 작동하지 않았습니다. NSKeyedArchiver 왕복 그러나, 한 :

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate]; 
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData]; 

는 사실 당신도 보관 된 템플릿을 한 번 계산 캐시 할 수 있습니다, 타오르는, 원시 페달 - 투 - 금속 속도를하려고하는 경우.

하지만 프레임 속도를 측정해서는 안됩니까? 이 경우 UIView의 복잡성도 작용합니다.

+0

내일 아침 열쇠 보관 방법을 사용해 보겠습니다. 프레임 속도와 관련하여 좋은 점을 언급합니다. UITableViewCells에 가장 빠른 방법을 분석하기 시작한 이유는 방향 변경 애니메이션이 매우 느리기 때문입니다. 이 애니메이션을 진행하는 동안 두 개의 UITableViewController 사이를 전환하고 UITableViewCell을로드 할 때 가장 큰 스택 추적이 강조 표시된 시간 프로파일 러가 발생합니다. 프레임 속도를 높이는 방법에 대한 제안 사항이 있습니까? – Eytan

0

일단로드 된 uitableviewcell nibs를 다시 사용하면 뷰 밖으로 나갈 수 있습니다.다음 읽기 :

iPhone - What are reuseIdentifiers (UITableViewCell)?

+0

당신은 Sanjay의 좋은 점이 있습니다. 내 펜촉로드 코드 위 몇 줄에서 적절한 재사용 식별자가있는 셀을 확인합니다. – Eytan

5
에서 iOS 5에서

과 WWDC 2011 비디오에서 언급이 UINib를 사용하는 새로운 방법이있다. 펜촉을 viewDidLoad: 방법으로 등록한 다음 tableView:cellForRowAtIndexPath: 방법으로 코드를 단순화하십시오. 이것은 당신을 위해 일을 빠르게 할 수 있습니다 (그러나 나는 결코 어떤 비교 타이밍도 수행하지 않았습니다).

예 :에서 당신의 viewDidLoad: 펜촉을 등록에 대한 참조 유지 :을 반환 보장으로 단지 (셀에 대한 nil을 확인 할 필요를 요구하지 귀하의 tableView:cellForRowAtIndexPath: 방법

NSString *myIdentifier = @"ReusableCustomCell"; 
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier]; 

을 iOS5 하의 셀)을 선택하고 셀을 구성하십시오.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *myIdentifier = @"ReusableCustomCell"; 

    ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
    // Your configuration code goes here 
    cell.nameLabel.text = @"some text"; 
    // .... 

    return cell; 
} 

코드 테스트를 거치지 않았습니다. 이것이 UINib를 단독으로 사용하는 것보다 더 빠르다면 나는 흥미로울 것이다.

+0

이것은 두 번째 편집에서 UINib를 사용하는 것과 본질적으로 같습니다. 나는 그것이 더 빨라지는 것을 상상할 수는 없지만 확실히 프로그램하는 것이 더 좋다. 나는 지금부터 할거야. 고마워! – Eytan

+0

"self.reuseCustomCell"이란 무엇입니까? – zakdances

+0

self.reuseCustomCell은 @property (비 원자력, 강함) id 행의 속성입니다. reuseCustomCell; –

관련 문제