2009-12-25 31 views
5

Tôi đã phát triển cho iPhone một thời gian và tôi đã tự hỏi liệu có bất kỳ đối tượng mảng nào sử dụng bộ đệm tròn trong Obj-C không? Giống như ngăn xếp hoặc danh sách hoặc hàng đợi của Java. Tôi đã được tinkering với NSMutableArray, kiểm tra giới hạn của nó ... và có vẻ như sau khi 50k đối tượng đơn giản bên trong mảng - ứng dụng được làm chậm đáng kể.Obj-C đối tượng đệm tròn, thực hiện một?

Vì vậy, có bất kỳ giải pháp nào tốt hơn so với NSMutableArray (trở nên rất chậm với lượng dữ liệu khổng lồ). Nếu không, bất cứ ai có thể cho tôi biết về một cách để tạo ra một đối tượng như vậy (sẽ liên quan đến việc sử dụng các đối tượng chuỗi (nút)?).

Bottom line: Populating một UITableView từ một DB SQLite trực tiếp sẽ là thông minh? Vì nó sẽ không yêu cầu bộ nhớ từ một mảng hay bất cứ thứ gì, nhưng chỉ là các truy vấn. Và SQLite là nhanh và không phải bộ nhớ mài.

Cảm ơn bạn rất nhiều vì đã dành thời gian và sự chú ý, ~ Natanavra.


Từ những gì tôi đã nghĩ rằng có vẻ như đi cho lớp Quinn là lựa chọn tốt nhất có thể. Tôi có một câu hỏi khác - nó sẽ nhanh hơn hoặc thông minh hơn để tải mọi thứ trực tiếp từ DB SQLite thay vì tạo một đối tượng và đẩy nó vào một mảng?

Cảm ơn bạn trước, ~ Natanavra.

Trả lời

8

Xin lỗi vì đã bỏ qua sừng của riêng tôi, nhưng tôi đã triển khai bộ đệm tròn C dựa trên CHDataStructures. Dự án là mã nguồn mở và có điểm chuẩn chứng minh rằng một bộ đệm tròn thực sự là khá nhanh khi so sánh với NSMutableArray trong trường hợp chung, nhưng kết quả sẽ phụ thuộc vào dữ liệu và cách sử dụng của bạn, cũng như thực tế là bạn đang hoạt động trên một thiết bị bị hạn chế về bộ nhớ (ví dụ như iPhone). Hy vọng rằng sẽ giúp!

+0

Cảm ơn! Điều đó nghe như những gì tôi đang tìm kiếm ... mặc dù nó không quan trọng, tôi muốn tìm cách để có thể hiển thị 50k-100k đối tượng dễ dàng trên UITableView. – natanavra

+0

Vậy có bất kỳ cấu trúc CHDataStructures nào cho phép tạo bộ đệm tròn FIFO thực, với ghi đè dữ liệu trước đó khi chèn lấp bộ đệm không? Cảm ơn! –

+1

Lớp của tôi thực hiện bộ đệm phát triển động, thay vì kích thước cố định, nhưng bạn có thể điều chỉnh nó để loại bỏ mã thay đổi kích thước và thêm một vài thay đổi để giải phóng đối tượng trước khi ghi đè chúng. Vì tôi sử dụng nó để trả về hàng đợi, và tôi không muốn ghi đè dữ liệu, tôi đã không xem xét trường hợp này. Không phải là ý tưởng tồi để tăng cường trong tương lai ... –

-3

Các đối tượng mục tiêu-C không thực sự "đơn giản", vì vậy 50.000 đối tượng trong số đó sẽ trở nên khá khó khăn. Viết của riêng bạn trong C thẳng hoặc C++ nếu bạn muốn tránh các nút cổ chai và nhu cầu tài nguyên của thời gian chạy Objective-C. thảo luận

Một khá dài và phi lý thuyết của các nguyên cần thiết liên quan đến sự tiện lợi:

http://www.cocoabuilder.com/archive/cocoa/35145-nsarray-overhead-question.html#35128

Và một số toán học đơn giản cho những người đơn giản:

Tất cả những gì cần thiết để làm cho một đối tượng như trái ngược với một cấu trúc là một con trỏ duy nhất ở đầu.

Giả sử đó là sự thật và giả sử chúng tôi đang chạy trên hệ thống 32 bit có 4 con trỏ byte.

4 byte x 50.000 đối tượng = 200000 bytes

Đó là gần 200MB giá trị bộ nhớ thêm rằng dữ liệu của bạn đột nhiên cần chỉ vì bạn sử dụng Objective-C. Bây giờ hợp chất đó với thực tế là bất cứ điều gì NSArray bạn thêm các đối tượng đến sẽ tăng gấp đôi bằng cách giữ bộ con trỏ riêng của mình cho các đối tượng đó và bạn vừa nhai 400MB RAM để bạn có thể sử dụng một vài tiện ích giấy gói.

Làm mới bộ nhớ của tôi ở đây ... Có phải tệp hoán đổi trên ổ cứng nhanh như RAM không? Có bao nhiêu RAM trong iPhone? Có bao nhiêu cuộc gọi chức năng và khung ngăn xếp để gửi một đối tượng một tin nhắn? Tại sao IOK không được viết trong Objective-C? Có bao nhiêu ứng dụng hàng đầu của Apple sử dụng rất nhiều DSP để sử dụng AppKit? Bất cứ ai có một bản sao của otool họ có thể kiểm tra với? Tôi thấy không ở đây.

+2

Trừ khi bạn đã lược tả và chứng minh rằng giải pháp C của bạn nhanh hơn, tôi sẽ không làm điều đó. – Chuck

+0

Bạn sẽ phải viết một số mã khá khủng khiếp để tìm ra một danh sách liên kết dựa trên C thực hiện chậm hơn số lượng thông điệp Objective-C đi qua trong việc duy trì một NSArray. –

+1

Bạn nên đọc toàn bộ chuỗi đó, bao gồm thông điệp từ Chris Kane, trước khi bạn cho rằng việc triển khai danh sách liên kết của riêng bạn sẽ vượt trội hơn NSArray. – NSResponder

1

Nó tầm thường để có hành vi mảng NSMutable như ngăn xếp, danh sách, hàng đợi, v.v. sử dụng các phương thức insertObject:atIndex:removeObjectAtIndex: khác nhau. Bạn có thể viết các lớp con của riêng mình nếu bạn muốn cứng rắn hành vi.

Tôi nghi ngờ các vấn đề về hiệu năng mà bạn đang gặp đang bị gây ra bởi NSMutableArray đặc biệt nếu điểm tham chiếu của bạn là Java chậm hơn nhiều. Vấn đề rất có thể là bản thân iPhone. Như đã lưu ý trước đây, 50.000 đối tượng mục tiêu-c không phải là một lượng dữ liệu tầm thường trong bối cảnh này và phần cứng iPhone có thể đấu tranh để quản lý nhiều dữ liệu.

Nếu bạn cần một loại mảng hiệu suất cao cho byte, bạn có thể sử dụng một trong các mảng nền tảng cốt lõi hoặc cuộn của riêng bạn trong đồng bằng C và sau đó bọc chúng trong một lớp tùy chỉnh.

Nghe có vẻ như tôi cần phải chuyển sang dữ liệu cốt lõi để bạn không phải giữ tất cả điều này trong bộ nhớ. Dữ liệu cốt lõi sẽ tìm nạp hiệu quả những gì bạn muốn chỉ khi bạn cần.

+0

"Java chậm hơn nhiều". bất kỳ điểm chuẩn nào? –

+0

NSArray không phải là đặc biệt nhanh, do đó, mặc dù nó có thể không phải là nguyên nhân duy nhất của vấn đề hiệu suất, nó sẽ không giúp gì cả. –

+0

Tôi chưa bao giờ thấy Java là ngôn ngữ được biên dịch tốt nhất trên cùng một phần cứng. Như NSD đã lưu ý, nhắn tin của Objective-C làm cho nó chậm hơn so với đồng bằng C (đó là một phần lý do tại sao bạn không thể sử dụng nó cho trình điều khiển) nhưng nó vẫn nhanh hơn một VM bởi rất nhiều. Tôi nghĩ rằng OP là vô thức so sánh hiệu suất của Java trên một hệ thống không được nhúng vào hiệu năng của Objective-C trên iPhone nhúng và giả định vấn đề là với ngôn ngữ/API thay vì phần cứng. Nếu anh ta không có cảm giác về tốc độ của phần cứng, anh ta sẽ lãng phí thời gian tìm kiếm các nút cổ chai không tồn tại. – TechZen

4

Nếu bạn gặp sự cố về hiệu suất, hãy đo lường vị trí ứng dụng của bạn dành thời gian của mình, đừng chỉ đoán. Apple cung cấp một bộ công cụ đo lường hiệu suất tuyệt vời.

+1

Trong khi vẹt Knuth thường xuyên an toàn và ấn tượng với người khác, không có phỏng đoán khi bạn đang nói về việc đẩy hàng chục nghìn đối tượng vào một mảng được quản lý trên hệ thống nhúng bị thiếu tài nguyên. –

+3

Tôi chắc rằng bạn nghĩ đó là một bộ lạc thông minh về phía bạn, nhưng bạn đã nhầm lẫn. Tôi có rất nhiều kinh nghiệm trực tiếp với những người mới tham gia Objective-C để đoán xem vấn đề hiệu suất của họ ở đâu. Tôi đã dành ba năm rưỡi tại Apple, trong đó có hơn một năm là kỹ sư Cocoa duy nhất tại DTS. – NSResponder

+0

@NSResponder Tôi không thực sự mới đối với Obj-C và tôi không có bất kỳ Vấn đề về hiệu suất nào. Tôi đã thử nghiệm nó với các công cụ và nó không phải là một đoán ... Vấn đề là với việc quản lý một vài trăm ngàn đối tượng và hiển thị chúng. Tôi có một cơ sở dữ liệu SQLite giúp lưu trữ và truy xuất mọi thứ dễ dàng nhưng câu hỏi là - làm thế nào bạn sẽ hiển thị tất cả khối lượng dữ liệu đó trong một UITableView. Vì vậy, một tùy chọn sẽ luôn luôn lấy các công cụ từ db SQLite của tôi bất cứ khi nào tôi muốn hiển thị một cái gì đó. Các tùy chọn khác tôi nghĩ là sử dụng một đối tượng đệm tròn. NSD là đúng và câu trả lời của bạn là ngoại tuyến. – natanavra

0

Bạn có thể sử dụng các lớp STL trong "Objective-C++" - đây là một tên ưa thích cho Objective-C sử dụng các lớp C++. Chỉ cần đặt tên cho các tệp nguồn sử dụng mã C++ với phần mở rộng ".mm" và bạn sẽ nhận được thời gian chạy hỗn hợp.

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