Các ứng dụng iOS có nhanh hơn các ứng dụng Android vì các ứng dụng Android được diễn giải không?


31

Các ứng dụng Android được giải thích thay vì biên dịch. Điều này có làm cho chúng chậm hơn ứng dụng iOS khi chạy không?


14
Đó không phải là một câu hỏi hay vì các ứng dụng Android không được giải thích, giống như câu trả lời đúng thực sự chỉ ra.
Aaronaught

2
Thông thường, câu trả lời được chấp nhận không phải là câu trả lời hay nhất không phải là vấn đề quá lớn, vì mục tiêu là giúp bất cứ ai hỏi câu hỏi (xem bài đăng meta này ). Nhưng đây là một trường hợp khá cực đoan @ArmonSafai Câu trả lời bạn chọn là chính xác có đầy đủ thông tin sai lệch và đã qua thời điểm có thể cứu vãn được với các chỉnh sửa. Hãy xem xét lựa chọn một câu trả lời khác.
Selali Adobor

Lưu ý rằng một số tập đoàn lớn - bao gồm IBM - đang viết các ứng dụng lớn trong Java những ngày này. Được cung cấp một trình biên dịch đúng lúc (JIT), là một phần tiêu chuẩn của máy ảo Java hiện đại, hiệu năng thực sự tương đương với bất kỳ ngôn ngữ cấp cao nào khác. Java đã không chỉ là "một ngôn ngữ được giải thích" trong nhiều năm.
keshlam

Các trình biên dịch JIT hoàn toàn không gắn với khái niệm JVM. Có những JVM không sử dụng trình biên dịch JIT, thậm chí là các trình biên dịch thương mại. Một số biến thể của JVM của IBM không bật JIT theo mặc định, thay vào đó mặc định là biên dịch AOT. Ngoài ra, một lưu ý nhỏ, "các ứng dụng chính trong Java ngày nay" có lẽ là một chút thích hợp hơn một thập kỷ trước (IBM đã thêm vào Java trước năm 1997)
Selali Adobor

Câu hỏi có phần sai lệch. Ứng dụng iOS "gốc" được viết bằng Objective-C (hoặc Swift) và được biên dịch, trong khi đó, ứng dụng Android "tiêu chuẩn" được viết bằng Java và được biên dịch thành mã byte. Xem câu trả lời của @ DanHulme. Nhưng có thể viết ứng dụng cho một trong hai nền tảng bằng HTML & JavaScript bằng cách sử dụng PhoneGap / Cordova. Một ứng dụng HTML thường được coi là chạy chậm hơn một ứng dụng gốc trên cùng một nền tảng. Vì vậy, nếu một ứng dụng tương tự cho nền tảng "khác" có vẻ chậm hơn thì có lẽ đó là do nó được tạo bằng công nghệ khác.
David

Câu trả lời:


85

Java không được giải thích trên Android. Các ứng dụng Android được nhà phát triển biên dịch sang mã byte . Bytecode là một đại diện nhỏ gọn của chương trình: nhỏ hơn mã nguồn được lập trình viên viết, nhưng vẫn không được CPU thực thi trực tiếp. Một số tối ưu hóa, chẳng hạn như loại bỏ mã chết, có thể được thực hiện ở giai đoạn này.

Khi bạn tải ứng dụng trên một thiết bị, Dalvik JVM sẽ biên dịch mã byte thành mã thực thi riêng, giống như khi nó sắp chạy. Đây là biên dịch chỉ trong thời gian . Nó gây ra sự chậm chạp ngắn trong khi chương trình chờ được biên dịch, nhưng sau đó không có chi phí hiệu năng, bởi vì mã đã được biên dịch thành mã thực thi riêng.

Có một số lợi thế về hiệu suất để thực hiện theo cách này thay vì biên dịch trước trên máy tính của nhà phát triển. Ứng dụng có thể được biên dịch cho CPU cụ thể trên điện thoại, tận dụng các tính năng phần cứng và sử dụng các đặc tính hiệu suất của nó. Ví dụ, nó có thể sử dụng các hoạt động điểm nổi phần cứng nếu CPU hỗ trợ nó. Ngoài ra, một trình biên dịch JIT thông minh (phải thừa nhận, Dalvik không hoàn toàn thông minh này) có thể theo dõi cách chương trình chạy và thực hiện tối ưu hóa dựa trên cách sử dụng chương trình trong thực tế. Nó có thể biên dịch lại mã với gợi ý nhánh tốt hơn một khi nó đã thấy các tùy chọn nào được bật và tắt trong môi trường của bạn, trên điện thoại của bạn. Một trình biên dịch lên phía trước không có thông tin này để sử dụng.

Dalvik sử dụng bộ đệm Dalvik và các kỹ thuật khác để giảm thiểu những hạn chế của quá trình biên dịch JIT. JVM mới cho Android L trở lên, ART, thay thế hoàn toàn JIT bằng trình biên dịch trước thời hạn . Điều này biên dịch mã byte thành mã thực thi riêng khi ứng dụng được cài đặt, để có được hầu hết các lợi thế của JIT mà không bị trì hoãn tải ứng dụng.

Đừng quên rằng các ứng dụng Android không hoàn toàn bao gồm Java. Các nhà phát triển có NDK để viết tất cả hoặc một phần ứng dụng của họ bằng C hoặc C ++, cho các phần quan trọng về hiệu năng của ứng dụng, đặc biệt là cho các trò chơi. Các giao diện mục đích đặc biệt như OpenGL và Rendercript cho phép các lập trình viên tận dụng phần cứng đặc biệt như bộ đồng xử lý GPU và SIMD cho một số loại tính toán.

Vì vậy, thực sự, không có câu trả lời đơn giản cho câu hỏi của bạn. Sử dụng JIT thay vì biên dịch trước làm cho một số thứ nhanh hơn, một số thứ chậm hơn. Đây chỉ là một phần trong hiệu năng tổng thể của HĐH.


1
+1 cho lời giải thích tuyệt vời. Tôi đã thực sự chờ đợi một câu trả lời như thế này.
MANI

5
Không khác nhiều so với cuộc tranh luận "hiệu năng .NET / Java so với C ++" cũ trên PC, thực sự. Đó là táo và cam.
Aaronaught

1
@ArmonSafai Khá vậy.
Dan Hulme

2
@MTilsted: Đó là loại đúng, nhưng nó lưu trữ hầu hết mọi thứ, vì vậy những gì bạn đang nói về khả năng sẽ chỉ xảy ra lần đầu tiên bạn chạy một ứng dụng.
Aaronaught

1
Vấn đề chính ở đây là Dalvik mặc dù là một JVM "bình thường". Giữa việc dựa trên đăng ký, trái ngược với stack dựa trên HotSpot (vì bản chất của bộ xử lý ARM so với các HotSpot đang nhắm mục tiêu [như IA32]), đó là sử dụng Zygote và khái niệm về các tệp odex (nghĩa là toàn bộ ý tưởng về không [nhiều hơn hoặc ít hơn] đi thẳng từ tệp lớp sang trình tải lớp), coi Dalvik như một JVM bình thường bị ràng buộc dẫn đến một số quan niệm sai lầm. Đặc biệt là vì nhiều chi tiết của việc triển khai HotSpot thường được liên kết nhầm với các JVM nói chung (như trình biên dịch JIT).
Selali Adobor

2

Vì đây là một câu hỏi rộng, đây là một câu trả lời rộng.

"Các ứng dụng iOS có nhanh hơn các ứng dụng Android vì các ứng dụng Android được diễn giải không?"

Trước hết, các ứng dụng iOS không "nhanh hơn" ứng dụng Android.

Thứ hai, liên quan đến vấn đề "Ứng dụng Android được giải thích." Đây là điều bạn nói về điện toán, như "15 năm trước": như bạn có thể thấy từ cuộc thảo luận ở trên, tình hình ngày nay phức tạp hơn nhiều; công nghệ hoàn toàn mới đã ra đời. Khái niệm "biên dịch nhanh hơn giải thích!" là so sánh có liên quan, bạn biết đấy, perl với mã máy 20 năm trước; mọi thứ đã chuyển sang rất nhiều vấn đề không thể thực sự được áp dụng rõ ràng cho "iOS V Android" ngày hôm nay.

Thứ ba, có những vấn đề khác trong lập trình di động hoàn toàn tràn ngập những cân nhắc như vậy. Chỉ cần một ví dụ trên thực tế, các lập trình viên di động đã tự mình xử lý các danh sách hình ảnh cuộn lớn, tải chậm và các vấn đề tương tự. Làm thế nào hai hệ điều hành và các thư viện phổ biến khác nhau xử lý các vấn đề quan trọng này thường làm thay đổi các vấn đề khác.

Thứ tư, chỉ một vấn đề áp đảo nữa trên điện thoại di động là các vấn đề của chipset đồ họa và các mối quan hệ phức tạp khác nhau của phần mềm, OpenGL, v.v. Ví dụ, Apple sắp ra mắt với một hệ thống mà họ sử dụng "Metal" liên quan đến những vấn đề này và Android sẽ ra mắt với "điều" riêng của họ trong lĩnh vực này. Những vấn đề xung quanh đường ống đồ họa cực kỳ quan trọng đối với cách ứng dụng "cảm nhận" trong tay bạn.

Câu trả lời rất ngắn cho câu hỏi của bạn là "biên dịch V. diễn giải" về cơ bản là một điểm thảo luận lỗi thời mà bạn biết?

(Ngoài ra, tôi đặc biệt không thấy Note3 "chậm" hơn iPhone. Ngoài ra, một số trong số này là vật phẩm thuần túy - có điện thoại Android rẻ tiền: đơn giản là không có iPhone hiệu suất thấp được sản xuất, vì vậy một số người có thể không chính xác ý tưởng từ đây.)


-3

Bởi vì các ứng dụng được giải thích không có nghĩa là chúng luôn chậm. Đôi khi chúng mạnh mẽ và năng động hơn so với biên dịch. Vì tất cả các mã trong ứng dụng đã biên dịch được biên dịch một lần và đầu ra được giữ ở dạng thư viện hoặc tệp thực thi, trong khi ở ngôn ngữ được giải thích, một lần có thể thay đổi ngẫu nhiên chuỗi thực thi. Vì vậy, tôi có thể nói, nó phụ thuộc vào nhà phát triển cho nhà phát triển và cách lập trình.

Tuy nhiên, Java (ngôn ngữ lập trình của Android) không được giải thích mà là JIT được biên dịch. Điều đó có nghĩa là các chương trình Android biên dịch ngay trước khi bạn chạy chúng, mang lại hiệu năng tương đối hợp lý với Objective C.

Gần đây, khung ART của Android biên dịch trước các ứng dụng, vì vậy chúng được chạy giống như các ứng dụng iOS. Nói cách khác, phiên bản tiếp theo của Android có lẽ sẽ nhanh như iOS.

Cập nhật

Ngôn ngữ lập trình thường rơi vào một trong hai loại: Biên dịch hoặc Phiên dịch. Với ngôn ngữ được biên dịch, mã bạn nhập được rút gọn thành một tập hợp các hướng dẫn cụ thể của máy trước khi được lưu dưới dạng tệp thực thi. Với các ngôn ngữ được thông dịch, mã được lưu theo cùng định dạng mà bạn đã nhập. Các chương trình được biên dịch thường chạy nhanh hơn các chương trình được giải thích vì các chương trình được giải thích phải được giảm xuống theo hướng dẫn của máy khi chạy. Tuy nhiên, với ngôn ngữ được dịch, bạn có thể thực hiện những điều không thể thực hiện bằng ngôn ngữ được biên dịch. Ví dụ, các chương trình diễn giải có thể tự sửa đổi bằng cách thêm hoặc thay đổi các chức năng trong thời gian chạy. Việc phát triển các ứng dụng trong môi trường được giải thích cũng thường dễ dàng hơn vì bạn không phải biên dịch lại ứng dụng của mình mỗi lần bạn muốn kiểm tra một phần nhỏ.


1
Ý bạn là gì "một lần có thể thay đổi ngẫu nhiên trình tự thực hiện? Và làm thế nào họ mạnh mẽ và năng động hơn? Ngoài ra, tôi không nói rằng họ chậm, chỉ là họ chậm hơn, thậm chí một chút.
Armon Safai

3
Điều này không hoàn toàn đúng. Thật sai lầm khi nói rằng không phải biên dịch lại là một lợi thế, vì bạn vẫn cần xây dựng tệp APK và triển khai nó cho thiết bị thử nghiệm. Google đã không quyết định sử dụng Java: Android đã dựa trên Java trước khi Google mua nó. Các tệp APK không chứa mã "ở cùng định dạng mà [lập trình viên] đã nhập."
Dan Hulme

1
Microsoft .NET được biên dịch thành mã IL, cũng được hiểu giống như java được biên dịch thành mã byte.
Esben Skov Pedersen

12
Rất nhiều thông tin trong câu trả lời này thực sự không liên quan hoặc đúng về mặt kỹ thuật. Tôi thành thật đề nghị câu trả lời này hoàn toàn được sửa đổi cho độ chính xác kỹ thuật.
Aza

2
Java nói chung không phải là ngôn ngữ được diễn giải , trừ khi bạn đang xử lý một triển khai JVM bất thường. Biên dịch JIT không giống như trình thông dịch, vì vậy hầu hết câu trả lời này thực sự không liên quan trong bối cảnh hiệu suất của Android vì nó sử dụng JIT.
eldarerathis
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.