2011-08-19 25 views
5

Có khác biệt nào giữa for(;;)for(:) về hiệu suất trong Mục tiêu-C không? Và thực tiễn tốt để sử dụng for(;;) hoặc for(:) là gì?cho (;;) so với (:) trong Hiệu suất Mục tiêu-C và Thực hành

+11

Hai dấu chấm phẩy tạo thành dấu hai chấm, vì vậy chúng giống hệt nhau. –

+0

Hahaha điểm tốt.Tôi tin rằng có thể có một số khác biệt về hiệu năng như bất kỳ ngôn ngữ nào khác như Javascript và C#. –

+1

Điều này sẽ rất dễ dàng để xây dựng một trường hợp thử nghiệm cho mỗi kiểu vòng lặp và thực hiện một số thao tác lược tả. –

Trả lời

11

Tôi giả sử rằng trong mỗi trường hợp bạn liệt kê một tập hợp các đối tượng, vì chỉ có biểu mẫu C for(;;) cho phép đếm các kiểu nguyên thủy. Việc xây dựng for(in) sử dụng giao thức được gọi là NSFastEnumeration để điền vào bộ đệm với các đối tượng để sử dụng trong các lần lặp lại trong tương lai và sử dụng con trỏ để theo dõi đối tượng nào nó đã đạt tới. Điều đó làm cho nó nhanh hơn:

NSEnumerator *e = [collection objectEnumerator]; 
while (id o = [e nextObject]) { 
    //... 
} 

đòi hỏi một thông điệp gửi cho mỗi lần lặp, và nó nhanh hơn:

for (NSInteger i=0; i < [collection count]; i++) { 
    id o = [collection objectAtIndex: i]; 
    //... 
} 

mà cũng đòi hỏi một thông điệp gửi cho mỗi lần lặp [*]. Cấu trúc for(in) chỉ yêu cầu thông báo gửi mỗi khi bộ đệm chạy khô, có thể là 8 lần lặp lại.

Lưu ý rằng cũng có vòng lặp dựa trên khối với [collection enumerateObjectsUsingBlock: ^(id obj, int idx, BOOL *stop){/*...*/}]; có các thuộc tính khác nhau một lần nữa. Đặc biệt là phiên bản của công trình này có các tùy chọn có thể được cho biết để thực hiện các khối đồng thời.

[*] Người đọc quan sát sẽ nhận thấy rằng điều này thực sự yêu cầu hai thông báo gửi cho mỗi lần lặp lại vì điều kiện chấm dứt sẽ được đánh giá mỗi lần; tuy nhiên nó rất dễ dàng để giảm bớt một tin nhắn gửi cho chúng tôi rằng chúng tôi sẽ coi nó là một trong những thảo luận này.

Các vấn đề liên quan