Tại sao lại tránh Enums Enums Nơi bạn chỉ cần Ints xóa khỏi mẹo hiệu suất của Android?


175

Phần "Tránh Enums Nơi bạn chỉ cần Ints" đã bị xóa khỏi tài liệu chính thức của nhà phát triển . (Xem Tại sao Android không sử dụng nhiều enum hơn? Cho nội dung phần cũ)

Tại sao? Có sự thay đổi nào trong máy ảo Android khiến cho mẹo này trở nên lỗi thời không?


2
Để tham khảo, đây là mã byte được dịch ngược cho ví dụ Shrubbery: https://gist.github.com/847418
Josh Lee

15
Kể từ tháng 3 năm 2014, trang sau vẫn có lời khuyên chống lại việc sử dụng enums: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar

2
Một năm sau, như @TahirAkhtar nói, khóa đào tạo chính thức của Android vẫn nói rằng "Bạn nên tuyệt đối tránh sử dụng enum trên Android".
LarsH

1
Điều thú vị cần lưu ý là nên tránh enum trong bài viết năm 2015 này từ một nhà phát triển Android chính: Medium.com/google-developers/. Ngoài ra: "Lưu ý rằng sử dụng chú thích @IntDef, được hỗ trợ bởi Android Studio và Gradle 1.3+, sẽ đảm bảo an toàn cho loại thời gian xây dựng mã của bạn (khi lỗi lint được bật), trong khi vẫn giữ được lợi ích về kích thước và hiệu suất của việc sử dụng biến int. "
tonylo

4
Kể từ tháng 4 năm 2018, trang sau không còn chứa lời khuyên chống lại việc sử dụng enums. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Câu trả lời:


157

phiên bản gốc của tài liệu đó chỉ là một loạt các định kiến. nó đã được viết lại để chỉ chứa các sự kiện được sao lưu bởi các điểm chuẩn thực tế và nó được cập nhật khi VM được cập nhật. bạn có thể tìm thấy các điểm chuẩn khác nhau - cộng với một số điểm chuẩn mà chúng tôi sử dụng để tối ưu hóa các thư viện cốt lõi - tại http://code.google.com.vn/p/dalvik/ .


35
Nó sẽ giúp nếu bạn liệt kê thông tin đăng nhập trong hồ sơ SO của bạn. Nó đưa tôi một số đào xung quanh. Nhưng bây giờ tôi thấy rằng bạn dường như làm việc trong nhóm VM, tôi sẽ chấp nhận câu trả lời của bạn là câu trả lời chính thức. :)
Thierry-Dimitri Roy

25
Thêm một lớp enum tất nhiên có nghĩa là ứng dụng của bạn chứa một lớp bổ sung, vì vậy nó không miễn phí , nhưng chúng tôi phải giả định rằng nhà phát triển chỉ thêm enum khi chúng hữu ích. Việc sử dụng thực sự tồi tệ duy nhất tôi từng thấy của enum là trong một số mã hài hòa nơi họ thực sự muốn ints (cho bitmasks và tương tự) và "enum" không phải là một enum theo bất kỳ ý nghĩa hợp lý nào. Nếu bạn thấy mình gọi "ordinal ()" rất nhiều, đó có lẽ là một mùi khó chịu có nghĩa là bạn không muốn có một enum. Nhưng đó không phải là một mẹo dành riêng cho Android và dù sao đó cũng là một lỗi thiết kế thực sự hiếm gặp.
Elliott Hughes

17
tài liệu này đã cũ cũng @ Thierry-DimitriRoy? Đặc biệt, Bạn nên tuyệt đối tránh sử dụng enums trên Android.
Jacob Tabak


11
Liên kết bạn đưa ra đã chết.
Terry

26

Đoán:

  • Các CPU Gigahertz như Hummingbird và Snapdragon hiện đã phổ biến và các yêu cầu bộ nhớ nhỏ mã nhỏ ban đầu đã hạn chế VM Dalvik không còn đúng như vậy nữa.
  • Mọi thiết bị vận chuyển đều sử dụng JIT (mới đến 2.2). Trình khởi tạo lớp của enum sẽ chạy nhanh hơn, các giá trị có thể được coi là hằng số thời gian JIT và JIT có thể có hỗ trợ đặc biệt để hợp lý hóa các lớp enum.
  • thực sự nhạy cảm với hiệu năng sử dụng NDK, vẫn còn mới và chưa được xử lý khi Android 1.5 được phát hành. NDK trong 2.3 hỗ trợ các hoạt động bản địa, cho phép các trò chơi gần như không được quản lý.

Do đó, đối với các yêu cầu tương đối trần tục của ứng dụng GUI, lợi ích về thời gian phát triển của enums vượt xa chi phí thời gian chạy thêm.


23

Elliott Hughes cung cấp thêm chi tiết về tài liệu viết lại trên blog của mình: http://elliotth.blogspot.com/2010/09/java-benchmark.html

Nửa sau của bài đăng giải thích rằng mọi khiếu nại về tài liệu Hiệu suất hiện được sao lưu bằng điểm chuẩn. Các phiên bản trước của tài liệu rõ ràng chứa các khiếu nại chưa được xác minh, như, "Tránh enum vì chúng quá đắt."


Chỉ muốn bổ sung câu trả lời được chấp nhận của Elliott với liên kết này.
jkooker

12

Câu trả lời năm 2011 từ Elliot Hugues nói rằng lý do ban đầu để tránh enum là vì lý do hiệu suất ... như trong "hiệu suất xử lý". Vì lý do này không được hỗ trợ bởi thực tế, nó đã bị xóa khỏi tài liệu chính thức.

Nó đã được thêm vào sau này vì enums thêm nhiều dữ liệu vào bộ nhớ hơn là sử dụng số nguyên.


2
Ngoài ra, các Google đã giới thiệu IntDefcác chú thích, cho phép sử dụng các hằng số int một cách an toàn với các lỗi và cảnh báo của Android Studio. blog.shamanland.com/2016/02/int-opes-enum.html
Oleksii K.

9

TLDR: Dalvik không tốt trong việc cấp phát bộ nhớ và Enumsử dụng nhiều bộ nhớ hơnint . Android Lollipop đã thay thế Dalvik bằng ART không gặp phải những hạn chế tương tự. Do đó khuyến nghị này không còn phù hợp nữa.

Câu trả lời dài:

Ồ 8 năm, 5 câu trả lời và nhiều bình luận sau đó lý do thực sự vẫn chưa được giải quyết.

Trong những ngày Android tiền kẹo mút, Dalvik là quá trình VM được sử dụng. Vì số lượng bộ nhớ nhỏ có sẵn cho các ứng dụng sử dụng trong thời gian đó, Dalvik có rất nhiều hạn chế về bộ nhớ. Để phân bổ bộ nhớ, Dalvik phải đi bộ và tìm chỗ trống. Heap cũng sẽ bị phân mảnh theo thời gian. Dalvik không thể chống phân mảnh, vì vậy nó sẽ phân bổ theo thời gian và cuối cùng hết dung lượng.

Tránh Enums Nơi bạn chỉ cần Ints

đến từ những ngày Dalvik vì một Enumcái lớn hơn rất nhiềuint và phân bổ bộ nhớ rất tốn kém.

Chuyển tiếp nhanh ngày hôm nay, Dalvik đã được thay thế bởi ART. ART xuất hiện trong KitKat và được mặc định kể từ Lollipop.

ART được tạo ra từ đầu để không tối ưu hóa cho bộ nhớ mà để tối ưu hóa cho hiệu suất. Nó cũng được tối ưu hóa để phân bổ và bộ sưu tập. Lý do là nó có bộ nhớ dành cho các đối tượng lớn. Thay vì đặt mọi thứ trong cùng một đống, và sau đó phải tìm không gian cho các vật thể lớn giữa tất cả những vật nhỏ bé, ART đặt tất cả các vật thể lớn và bitmap thành một đống riêng biệt. Và sau đó các đối tượng nhỏ đi trong đống riêng biệt. Ngoài ra nó có thể chống phân mảnh.

Sau ART, nếu bạn sử dụng Enum Android thì không quan tâm và đây là lý do tại sao khuyến nghị không còn nữa.

Điều này đến từ Chet Haase tại Google. Tôi khuyên bạn nên tìm Google I / O talk của anh ấy và xem toàn bộ video. Nó chứa rất nhiều thông tin hữu ích và cái nhìn sâu sắc về Android.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.