2010-05-27 21 views
12

Tôi đang tìm kiếm lời khuyên để tăng tốc hiệu suất tuần tự hóa, đặc biệt khi sử dụng Google Android. Đối với một dự án tôi đang làm việc trên, tôi đang cố gắng chuyển tiếp vài trăm đối tượng từ máy chủ sang ứng dụng Android và đang trải qua các giai đoạn khác nhau để có được hiệu suất tôi cần. Trước tiên, tôi đã thử một trình phân tích cú pháp XML khủng khiếp mà tôi đã tấn công với nhau bằng cách sử dụng Máy quét dành riêng cho dự án này và gây ra hiệu suất chậm không ngờ khi tải các đối tượng (~ 5 phút cho một tệp 300KB). Sau đó tôi di chuyển ra khỏi đó và thực hiện các lớp học của tôi thực hiện Serializable và đã viết ArrayList của các đối tượng tôi đã có một tập tin. Đọc tập tin đó vào các đối tượng Android, với tập tin đã được tải về tâm trí bạn, đã dành ~ 15-30 giây cho tập tin được tuần tự hóa 100KB. Tôi vẫn thấy điều này hoàn toàn không được chấp nhận đối với một ứng dụng Android, vì ứng dụng của tôi yêu cầu tải dữ liệu khi khởi động ứng dụng.Hiệu suất tuần tự hóa và Google Android

Tôi đã đọc một thời gian ngắn về Externalizable và cách nó có thể tăng hiệu suất, nhưng tôi không chắc chắn cách thực hiện nó với các lớp lồng nhau. Ngay bây giờ, tôi đang cố gắng lưu trữ một ArrayList của lớp sau, với các lớp lồng bên dưới nó.

public class MealMenu implements Serializable{ 
private String commonsName; 
private long startMillis, endMillis, modMillis; 
private ArrayList<Venue> venues; 
private String mealName; 
} 

Và lớp Địa điểm:

public class Venue implements Serializable{ 
private String name; 
private ArrayList<FoodItem> foodItems; 
} 

Và lớp FoodItem:

public class FoodItem implements Serializable{ 
private String name; 
private boolean vegan; 
private boolean vegetarian; 
} 

NẾU Externalizable là con đường để đi để tăng hiệu suất, là có bất kỳ thông tin như thế nào java gọi các phương thức trong các đối tượng khi bạn cố gắng viết nó ra? Tôi không chắc chắn nếu tôi cần phải thực hiện nó trong lớp cha mẹ, cũng không làm thế nào tôi sẽ đi về serializing các đối tượng lồng nhau trong mỗi đối tượng.

Trả lời

10

Không bao giờ sử dụng Serializable trên các kiến ​​trúc. Bạn không có cách nào để biết nếu máy ảo Dalvik sẽ có serialization tương thích với phiên bản Java của máy chủ của bạn. Ngay cả khi nó hoạt động ngày hôm nay, nó có thể không có nâng cấp ở hai đầu. Luôn chọn một cái gì đó được thiết kế đặc biệt để làm việc trên các kiến ​​trúc.

tùy chọn bao gồm:

  • Nghị định thư Buffers
  • Apache tiết kiệm (bao bì tải trọng, không nhất thiết phải là thứ RPC)
  • XML (bạn bỏ quên đề cập đến những gì phân tích cú pháp bạn sử dụng - nếu bạn sử dụng DOM , hãy thử SAX)
  • JSON (báo cáo phân tích cú pháp JSON Jackson là nhanh hơn so với phân tích cú pháp org.json xây dựng vào Android)

Ngoài ra, tải 300K dữ liệu về khởi động ứng dụng là một đơn thuốc cho sự cố. Hãy xem xét tận dụng SQLite để cho phép bạn làm việc chỉ với các bit dữ liệu bạn cần tại một thời điểm.

+0

Không chắc chắn tôi hiểu rằng nhận xét - với 'Serializable' bạn không phải dựa vào cơ chế mặc định. Bạn luôn có thể định nghĩa của riêng bạn với 'readFields()' et al. –

+1

Và bạn cho rằng các trường này được mã hóa liên tục trên các kiến ​​trúc. Serialization được thiết kế để lưu trữ cho một máy tính cá nhân, không phải trên các máy, hãy để một mình trên các chipset và các tác giả VM. – CommonsWare

+0

Tôi đã chuyển sang cơ sở dữ liệu SQLite như bạn đã đề xuất và thời gian tải cho ứng dụng là tốt hơn đáng kể. Tuy nhiên, việc tạo cơ sở dữ liệu vẫn chiếm một lượng thời gian rất lớn. Với thiết kế cơ sở dữ liệu hiện tại đã thêm ~ 3000 hàng khi chúng ta điền cơ sở dữ liệu, cũng như khi thêm nội dung mới.~ 2500 đến một bàn, ~ 500 cái khác, và ~ 150 đến một phần ba. Có điều gì chúng tôi có thể làm sai về vấn đề này không? Có thể mất ít nhất một phút để thêm các hàng vào cơ sở dữ liệu. Điều duy nhất đến với tâm trí của tôi là thiết kế lại việc sử dụng cơ sở dữ liệu của chúng tôi vì vậy chúng tôi không cần quá nhiều –

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