2011-12-13 27 views
15

Trình thu thập thông tin thời gian cho thấy hoạt động tốn nhiều thời gian nhất trong ứng dụng của tôi đang tải UITableViewCells từ các tệp nib. Giá đắt nhất liên quan đến việc tải UITableViewCell bằng hình ảnh 4KB.Tạo UITableViewCell nhanh hơn hoặc tải một chương trình từ một ngòi bút có nhanh hơn không?

Tôi tải UITableViewCell từ ngòi với đoạn mã sau:

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

Có ai so sánh sự khác biệt giữa việc tạo một cái nhìn lập trình hoặc tải một UITableViewCell từ một ngòi bút?

EDIT:
Tôi đã so sánh hồ sơ thời gian của các lần chạy lặp lại tải UITableViewCell từ ngòi bút và tạo chế độ xem theo chương trình. Thử nghiệm của tôi liên quan xen kẽ giữa hai số UITableViews khoảng 10 lần trong khoảng 3-5 giây. Trong mỗi thử nghiệm, tải UITableViewCell lập trình nhanh hơn đáng kể, nhanh hơn từ 2x đến 6 lần.

Có ai có thể chứng thực những kết quả này không?

EDIT: Tôi đã cập nhật mã tải nib để chỉ tải tệp nib một lần và sử dụng phiên bản được lưu trong bộ nhớ cache cho các cuộc gọi tiếp theo.

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

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

Tôi cũng sử dụng các công cụ tự động hóa để tạo ra chạy ổn định hơn và kết quả vẫn đề nghị tải UITableViewCells lập trình nhanh hơn tải UITableViewCells cho một ngòi. Thời gian chạy trung bình để tải UITableViewCells từ ngòi bút là khoảng 90 mili giây, trong khi thời gian chạy trung bình để tạo UITableViewCell theo chương trình là 50 mili giây.

+0

Hiển thị cho chúng tôi mã tải nib của bạn. –

+0

Cảm ơn bạn đã xem @robmayoff. Tôi đã cập nhật câu hỏi để bao gồm mã của tôi để tải ngòi bút. – Eytan

+0

Tìm kiếm thú vị - bạn có thể chạy lại thử nghiệm bằng cách sử dụng các bảng phân cảnh và các ô mẫu thử nghiệm, nơi chế độ xem bảng thực hiện tất cả tải nib trong nền không? – jrturton

Trả lời

13

Thử tạo đối tượng UINib một lần và sau đó gửi instantiateWithOwner:options: mỗi khi bạn cần tạo ô mới. Từ UINib Class Reference:

Ví dụ, nếu xem bảng của bạn sử dụng một tập tin nib để nhanh chóng các tế bào xem bảng, bộ nhớ đệm ngòi trong một đối tượng UINib có thể cung cấp một sự cải thiện hiệu suất đáng kể.

+0

Wow đã giúp rất nhiều! Thời gian chạy trung bình (trong khoảng thời gian của những người theo chủ nghĩa) đã giảm từ khoảng 300ms xuống 90ms khi tải từ NIB sử dụng kỹ thuật mà bạn đã đề cập. Đang tải theo chương trình, có thời gian chạy trung bình khoảng 50 ms. – Eytan

2

tôi tải các tế bào ngòi (cellTemplate) một lần và lặp lại nó khi cần thiết, vì vậy trong một cảm giác phương pháp này là cả hai chương trình nib dựa.

Nhân bản phức tạp hơn tôi mong đợi là mutableCopy không hoạt động. Một NSKeyedArchiver khứ hồi đã làm, tuy nhiên:

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

Trong thực tế, nếu bạn đang đi để nguyên, lòng đam mê, tốc độ đạp-to-the-metal, ngay cả những mẫu được lưu trữ có thể được tính một lần và lưu trữ.

Nhưng bạn không nên đo tốc độ khung hình? Trong trường hợp đó, sự phức tạp của UIView cũng được phát huy.

+0

Tôi sẽ thử phương pháp lưu trữ được khóa vào sáng mai. Bạn chạm vào một điểm tốt liên quan đến tốc độ khung hình. Lý do tôi bắt đầu phân tích phương thức nhanh nhất cho UITableViewCells là vì hoạt ảnh thay đổi định hướng của tôi cực kỳ chậm. Trong hoạt ảnh này, tôi chuyển đổi giữa hai UITableViewControllers và trình lược tả thời gian làm nổi bật dấu vết stack nặng nhất xảy ra khi tôi tải UITableViewCells. Bạn có bất cứ gợi ý nào về cách tăng tốc độ khung hình không? – Eytan

0

Có thể sử dụng lại ngòi bút uitableviewcell đã được tải một lần và sau đó chúng ra khỏi chế độ xem.Đọc phần sau đây:

iPhone - What are reuseIdentifiers (UITableViewCell)?

+0

Bạn có một điểm tốt Sanjay. Một vài dòng trên mã tải nib của tôi, tôi kiểm tra các ô có mã định danh tái sử dụng thích hợp. – Eytan

5

Trong iOS 5 và được nhắc đến trong WWDC 2011 video, có một phương pháp mới sử dụng UINib. Bạn đăng ký ngòi bút của mình theo phương pháp viewDidLoad: và sau đó đơn giản hóa mã theo phương pháp tableView:cellForRowAtIndexPath:. Điều này có thể tăng tốc độ cho bạn (nhưng tôi chưa bao giờ thực hiện bất kỳ thời gian so sánh nào).

Ví dụ: Trong bạn viewDidLoad: đăng ký nib và duy trì một tham chiếu đến nó:

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

Trong phương pháp tableView:cellForRowAtIndexPath: bạn chỉ cần hỏi cho các tế bào (không cần phải kiểm tra các con số không như nó được đảm bảo để trả lại một ô dưới iOS5) và định cấu hình ô:

- (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; 
} 

Mã chưa được kiểm tra. Tôi muốn được quan tâm nếu điều này là bất kỳ nhanh hơn so với sử dụng UINib một mình.

+0

Điều này về cơ bản giống với việc sử dụng UINib như tôi đang ở trong bản chỉnh sửa thứ hai của mình. Tôi không thể tưởng tượng nó sẽ nhanh hơn nhưng nó chắc chắn là đẹp hơn cho chương trình. Tôi sẽ làm điều đó từ bây giờ - Cảm ơn! – Eytan

+0

"self.reuseCustomCell" đề cập đến là gì? – zakdances

+0

self.reuseCustomCell là thuộc tính dọc theo các dòng @property (nonatomic, strong) id reuseCustomCell; –