2009-11-24 34 views
12

Tôi đang phát triển một Java Applet và việc giảm kích thước của mã nhị phân sẽ làm cho applet mở nhanh hơn và sẽ cải thiện trải nghiệm người dùng.Tôi có thể làm gì để làm cho lọ/lớp nhỏ hơn?

Tôi có thể làm gì để giảm kích cỡ của lớp và/hoặc tệp jar không? Tôi muốn chắc chắn rằng tôi không bỏ lỡ những thủ đoạn rõ ràng.

Tôi biết rằng trong các tùy chọn trình biên dịch thế giới C++ cho ví dụ: tước các biểu tượng gỡ lỗi có thể tạo ra một sự khác biệt rất lớn, nhưng tôi chưa bao giờ thấy một cái gì đó như thế cho Java.

Trả lời

11

Bạn có thể sử dụng

javac -g:none 

để loại bỏ thông tin gỡ lỗi - Tôi không biết có bao nhiêu khác biệt nó có khả năng để làm mặc dù.

Bạn cho rằng thời gian tải xuống có phải là nút cổ chai không? Làm thế nào lớn là applet? Trừ khi nó là rất lớn, tôi nghi ngờ rằng kích thước sẽ làm cho nhiều sự khác biệt sau khi nó được tải về.

+0

Ứng dụng này là 500k trừ thư viện. Nó không phải là thứ duy nhất ảnh hưởng đến thời gian khởi động, nhưng tôi nghĩ nó đủ quan trọng để điều tra thêm. – amarillion

0

Bạn có thể sử dụng công cụ để áp dụng mã obfuscation. Điều này thường sẽ thu hẹp biến và tên phương thức và giảm đáng kể kích thước lớp học. Điều này thường được thực hiện khi triển khai mã cho nền tảng J2ME.

+0

Bạn có thể cung cấp tên của công cụ này không? Cảm ơn. – FaithReaper

6

Proguard là trình thu gọn, trình tối ưu hóa, trình tối ưu hóa và trình chỉnh sửa lớp Java miễn phí. Nó phát hiện và loại bỏ các lớp, các trường, phương thức và các thuộc tính không sử dụng. Nó tối ưu hóa bytecode và loại bỏ các hướng dẫn không sử dụng.

Báo cáo trên trang web proguard hiển thị các ví dụ về mức giảm, dao động từ 19 đến 90%.

11

hãy xem trang này để biết một số mẹo về cách bạn có thể tạo tệp jar nhỏ hơn - http://wiki.java.net/bin/view/Games/4KGamesDesign. Mặc dù một số có thể không áp dụng vì bạn không cố gắng tối thiểu hóa tuyệt đối, có một số mẹo chung mà bạn có thể áp dụng mà không ảnh hưởng đến chất lượng mã.

nhưng tóm tắt ở đây:

Giữ mã của bạn xuống một lớp. Mỗi lớp cho biết thêm chi phí của một mục trong tệp JAR, cũng như một danh sách lớp và danh sách lớp hoàn toàn mới.

Giữ phương pháp của bạn ở mức tối thiểu. Mỗi phương thức cho biết thêm chi phí trong tệp lớp. Tất cả những gì bạn cần là một phương thức main() và các phương pháp để thực hiện thói quen bàn phím và/hoặc chuột.

Không sử dụng các biến toàn cầu. Biến toàn cầu yêu cầu siêu dữ liệu đặc biệt trong lớp để xác định. Tuy nhiên, các biến phương pháp cục bộ chỉ là các mục nhập ngăn xếp và không tốn thêm chi phí nào để sử dụng.

Sử dụng máy nén tốt như 7Zip hoặc KZip để tạo tệp JAR của bạn. Tiện ích JAR chủ yếu được thiết kế cho tính chính xác, không phải tỷ lệ nén.

Sử dụng bộ obfuscator như ProGuard, JoGa hoặc JShrink để tối ưu hóa kích thước lớp học của bạn.

Sử dụng một ký tự đơn cho tên tệp lớp. Điều này làm giảm kích thước của nó trong nội bộ, giảm lượng thông tin mà chương trình Zip lưu trữ và giảm kích thước của tệp kê khai.

Tham khảo càng ít lớp càng tốt. Mỗi lớp bạn tham khảo sẽ thêm toàn bộ gói và tên lớp, cộng với chữ ký phương thức bạn đang gọi.

Dự phòng (chẳng hạn như sử dụng cùng tên cho tất cả các phương pháp và lớp và trường) cải thiện tỷ lệ nén.

Phương pháp được đặt ở chế độ riêng tư và cuối cùng có thể được trình tối ưu hóa lớp đưa vào.

Sử dụng phương thức String.valueOf() để chuyển đổi nguyên thủy thành chuỗi. Ví dụ: ""+number mở rộng tới: new StringBuffer?().append("").append(number).toString() lãng phí rất nhiều không gian trong các tham chiếu lớp và phương thức mới.

Chuỗi tĩnh, phao nổi và số nguyên được sử dụng trong mã nguồn được lưu trữ trong nhóm không đổi. Kết quả là, bạn càng có thể sử dụng lại giá trị tĩnh, thì lớp của bạn sẽ càng nhỏ hơn .

Bạn có thể sử dụng tự do biến tĩnh cuối cùng cho các hằng số. Điều này sẽ làm cho mã của bạn dễ đọc hơn và ProGuard sẽ tối ưu hóa việc này để không có thêm chi phí.

+0

Biến toàn cầu? Java không có. – uckelman

+1

Tôi nghĩ Chii có nghĩa là các biến thành viên cấp lớp –

+3

Đó là danh sách rất chi tiết về những thứ * không * để làm, thậm chí không vì mục đích kích hoạt, trừ khi nó chỉ dành cho việc sử dụng trình diễn. :) – Bombe

1

Theo tôi có thể nói bạn không thể tách biểu tượng khỏi tệp lớp Java, nhưng bạn có thể rút ngắn số nhận dạng. Tuy nhiên, điều này có thể sẽ làm cho ngăn xếp dấu vết vô dụng, vì vậy tôi không ủng hộ nó.

Tuy nhiên bạn losslessly có thể giảm kích thước tập tin bằng cách nén lại file .jar của bạn sử dụng các thuật toán deflate cải thiện từ AdvanceCOMP project (tài liệu lưu trữ .jar chỉ là đồng bằng file .zip bên trong).

3

Classdepandjar được sử dụng trong thế giới Jini để giảm kích thước tệp jar (Jini truyền xung quanh rất nhiều mã từ xa, do đó yêu cầu này). Nó loại bỏ các lớp không được tham chiếu từ bên trong cùng một cái lọ.

Rõ ràng có những trường hợp ngoại lệ cho điều này (các lớp được nạp theo tên vv) và do đó bạn có thể chứa các cấu hình này trong cấu hình. Bạn có thể thử nghiệm hầu hết với bình “lắc” của bạn để xác định rằng các phụ thuộc có liên quan vẫn còn.

2

pack200 (và gzip) tạo ra các tệp nhỏ hơn nhiều so với các tệp (các tệp zip có hiệu quả).

-1

Nếu bạn sử dụng NetBeans, bạn có thể đặt tập lệnh xây dựng để tạo tệp nén JAR trong cấu hình dự án (trong Xây dựng-> Bao bì). Có thể không hiệu quả như các giải pháp khác, nhưng nó chỉ là một hộp kiểm. :-)

3

Một số gợi ý để cải thiện kích thước Applet:

  1. xáo trộn - Proguard là tốt nhất cho hiệu suất tổng thể cho tôi - qua giảm 25% đối với tôi. Ngoài ra nó sẽ cung cấp nén tốt trong Jar.

  2. Tối ưu hóa mọi tài nguyên - giảm hình ảnh đính kèm bằng trình tối ưu hóa hình ảnh, chất lượng thấp hơn nếu thích hợp.

  3. Thay đổi mã - Tôi thấy bạn không thực sự muốn làm điều này, nhưng đáng xem xét tệp Jar của bạn và kiểm tra số lượng lớp được tạo. Lớp tầm thường nhất sẽ có giá khoảng 500 byte.Nếu bạn có rất nhiều lớp bên trong vô danh, nó có thể tái cấu trúc giá trị.

  4. Tải tài nguyên theo yêu cầu - Tải applet ban đầu. Tải tài nguyên bổ sung không đồng bộ sau khi bắt đầu.

0
  1. Tắt nén khi đóng gói tệp JAR.
  2. Sử dụng nén HTTP để truyền tệp JAR.

Nén HTTP thường chỉ chiếm băng thông 50% -80% so với nén JAR, đặc biệt khi bạn tạo nhiều lớp, ví dụ: một chương trình Scala.

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