Tốc độ Java so với C++

Java là ngôn ngữ lập trình chính thức của Android và nó là cơ sở cho nhiều thành phần của hệ điều hành, cộng với nó được tìm thấy ở lõi SDK của Android. Java có một số thuộc tính thú vị làm cho nó khác với các ngôn ngữ lập trình khác như C

[relative_videos title=”Gary giải thích. ” align=”right” type=”custom” videos=”684167,683935,682738,681421,678862,679133″]Trước hết Java không [nói chung] biên dịch thành mã máy gốc. Thay vào đó, nó biên dịch sang ngôn ngữ trung gian được gọi là mã byte Java, tập lệnh của Máy ảo Java [JVM]. Khi ứng dụng chạy trên Android, nó được thực thi thông qua JVM, JVM này sẽ chạy mã trên CPU gốc [ARM, MIPS, Intel]

Thứ hai, Java sử dụng quản lý bộ nhớ tự động và như vậy thực hiện bộ thu gom rác [GC]. Ý tưởng là các lập trình viên không cần phải lo lắng về việc bộ nhớ nào cần được giải phóng vì JVM sẽ theo dõi những gì cần thiết và khi một phần bộ nhớ không còn được sử dụng, bộ thu gom rác sẽ giải phóng bộ nhớ đó. Lợi ích chính là giảm rò rỉ bộ nhớ trong thời gian chạy

Ngôn ngữ lập trình C hoàn toàn trái ngược với Java ở hai khía cạnh này. Đầu tiên, mã C được biên dịch thành mã máy gốc và không yêu cầu sử dụng máy ảo để giải thích. Thứ hai, nó sử dụng quản lý bộ nhớ thủ công và không có bộ thu gom rác. Trong C, lập trình viên được yêu cầu theo dõi các đối tượng đã được cấp phát và giải phóng chúng khi cần thiết

Mặc dù có những khác biệt về thiết kế triết học giữa Java và C, nhưng cũng có những khác biệt về hiệu suất

Có những khác biệt khác giữa hai ngôn ngữ, tuy nhiên chúng ít ảnh hưởng đến các mức hiệu suất tương ứng. Ví dụ, Java là ngôn ngữ hướng đối tượng, C thì không. C chủ yếu dựa vào số học con trỏ, Java thì không. Và như thế…

Hiệu suất

Vì vậy, trong khi có sự khác biệt về thiết kế triết học giữa Java và C, thì cũng có sự khác biệt về hiệu suất. Việc sử dụng máy ảo sẽ thêm một lớp bổ sung vào Java không cần thiết cho C. Mặc dù sử dụng máy ảo có những ưu điểm bao gồm tính di động cao [i. e. cùng một ứng dụng Android dựa trên Java có thể chạy trên các thiết bị ARM và Intel mà không cần sửa đổi], mã Java chạy chậm hơn mã C vì nó phải trải qua giai đoạn diễn giải bổ sung. Có những công nghệ đã giảm chi phí hoạt động này xuống mức tối thiểu nhất [và chúng tôi sẽ xem xét những công nghệ đó ngay lập tức], tuy nhiên, vì các ứng dụng Java không được biên dịch thành mã máy gốc của CPU của thiết bị nên chúng sẽ luôn chậm hơn

Yếu tố quan trọng khác là người thu gom rác. Vấn đề là việc thu gom rác cần có thời gian, cộng với việc nó có thể chạy bất cứ lúc nào. Điều này có nghĩa là một chương trình Java tạo nhiều đối tượng tạm thời [lưu ý rằng một số loại thao tác Chuỗi có thể không tốt cho việc này] thường sẽ kích hoạt trình thu gom rác, do đó sẽ làm chậm chương trình [ứng dụng]

Google khuyến nghị sử dụng NDK cho 'các ứng dụng sử dụng nhiều CPU như công cụ trò chơi, xử lý tín hiệu và mô phỏng vật lý. '

Vì vậy, sự kết hợp của việc giải thích thông qua JVM, cộng với tải bổ sung do thu gom rác có nghĩa là các chương trình Java chạy chậm hơn trong các chương trình C. Sau tất cả những điều đó, những chi phí phát sinh này thường được coi là một điều xấu cần thiết, một thực tế cố hữu khi sử dụng Java, nhưng lợi ích của Java so với C về mặt thiết kế "viết một lần, chạy mọi nơi" cộng với tính hướng đối tượng của nó

Điều đó được cho là đúng trên máy tính để bàn và máy chủ, nhưng ở đây chúng tôi đang xử lý thiết bị di động và trên thiết bị di động, mọi xử lý bổ sung đều tiêu tốn thời lượng pin. Vì quyết định sử dụng Java cho Android đã được đưa ra trong một số cuộc họp ở đâu đó tại Palo Alto vào năm 2003 nên không có lý do gì để phàn nàn về quyết định đó

Mặc dù ngôn ngữ chính của Bộ công cụ phát triển phần mềm Android [SDK] là Java, nhưng đó không phải là cách duy nhất để viết ứng dụng cho Android. Bên cạnh SDK, Google còn có Bộ công cụ phát triển gốc [NDK] cho phép các nhà phát triển ứng dụng sử dụng các ngôn ngữ mã gốc như C và C++. Google khuyến nghị sử dụng NDK cho “các ứng dụng sử dụng nhiều CPU như công cụ trò chơi, xử lý tín hiệu và mô phỏng vật lý. ”

SDK so với NDK

Tất cả lý thuyết này rất hay, nhưng một số dữ liệu thực tế, một số con số để phân tích sẽ tốt vào thời điểm này. Sự khác biệt về tốc độ giữa ứng dụng Java được tạo bằng SDK và ứng dụng C được tạo bằng NDK là gì? . Thời gian thực hiện các chức năng trong Java và trong C được tính bằng nano giây và được ứng dụng báo cáo để so sánh

[relative_videos title=”Ứng dụng Android tốt nhất. ” align=”left” type=”custom” videos=”689904,683283,676879,670446″]Tất cả điều này nghe có vẻ tương đối cơ bản, tuy nhiên, có một số vấn đề khiến sự so sánh này kém dễ hiểu hơn tôi mong đợi. Nguyên nhân của tôi ở đây là tối ưu hóa. Khi tôi phát triển các phần khác nhau của ứng dụng, tôi thấy rằng những chỉnh sửa nhỏ trong mã có thể thay đổi đáng kể kết quả hoạt động. Ví dụ: một phần của ứng dụng tính toán hàm băm SHA1 của một đoạn dữ liệu. Sau khi hàm băm được tính toán, giá trị hàm băm được chuyển đổi từ dạng số nguyên nhị phân thành một chuỗi con người có thể đọc được. Thực hiện một phép tính băm đơn lẻ không mất nhiều thời gian, vì vậy, để có điểm chuẩn tốt, hàm băm được gọi là 50.000 lần. Trong khi tối ưu hóa ứng dụng, tôi nhận thấy rằng việc cải thiện tốc độ chuyển đổi từ giá trị băm nhị phân sang giá trị chuỗi đã thay đổi đáng kể thời gian tương đối. Nói cách khác, bất kỳ thay đổi nào, dù chỉ là một phần nhỏ của giây, sẽ được phóng đại 50.000 lần

Bây giờ bất kỳ kỹ sư phần mềm nào cũng biết về điều này và vấn đề này không phải là mới cũng không phải là không thể khắc phục được, tuy nhiên tôi muốn đưa ra hai điểm chính. 1] Tôi đã dành vài giờ để tối ưu hóa mã này, để đạt được kết quả tốt nhất từ ​​cả phần Java và C của ứng dụng, tuy nhiên tôi không phải là không thể sai lầm và có thể có nhiều cách tối ưu hóa hơn nữa. 2] Nếu bạn là nhà phát triển ứng dụng thì tối ưu hóa mã của bạn là một phần thiết yếu của quy trình phát triển ứng dụng, đừng bỏ qua nó

Ứng dụng điểm chuẩn của tôi thực hiện ba việc. Đầu tiên, nó liên tục tính toán SHA1 của một khối dữ liệu, bằng Java và sau đó bằng C. Sau đó, nó tính toán 1 triệu số nguyên tố đầu tiên bằng phép chia thử, một lần nữa cho Java và C. Cuối cùng, nó liên tục chạy một hàm tùy ý thực hiện nhiều hàm toán học khác nhau [nhân, chia, với số nguyên, với số dấu phẩy động, v.v.], cả trong Java và C

Hai bài kiểm tra cuối cùng cho chúng tôi mức độ chắc chắn cao về sự bằng nhau của các hàm Java và C. Java sử dụng rất nhiều kiểu dáng và cú pháp từ C và do đó, đối với các hàm  tầm thường, rất dễ sao chép giữa hai ngôn ngữ. Dưới đây là mã để kiểm tra xem một số có phải là số nguyên tố hay không [sử dụng phép chia thử] cho Java và sau đó cho C, bạn sẽ nhận thấy rằng chúng trông rất giống nhau

Sao chép văn bản

public boolean isprime[long a]
{
        if[a == 2]{
                return true;
        }else if[a 

Chủ Đề