Hiệu suất Java so với C ++

QCon London (27-29 tháng 3 năm 2023). Áp dụng các xu hướng mới nổi phù hợp để giải quyết các thách thức kỹ thuật của bạn

Java so với. Hiệu suất C

thích dấu trang

Xem bản trình bày

  • Theo chiều dọc
  • Nằm ngang
  • Đầy

Tốc độ, vận tốc

  • 1x
  • 1. 25 lần
  • 1. 5x
  • gấp đôi

Tải xuống

  • MP3
  • trang trình bày

48. 38

Bản tóm tắt

Cliff Click xem hiệu suất Java vs C. Anh ấy thảo luận về điểm mạnh và điểm yếu của cả hai ngôn ngữ và bối cảnh lập trình xung quanh việc lựa chọn ngôn ngữ, điều này thường có tác động mạnh mẽ hơn nhiều đến hoạt động kinh doanh lập trình so với việc lựa chọn ngôn ngữ đơn thuần.

sinh học

Cliff Click là CTO và Đồng sáng lập của H2O, nhà sản xuất H2O, công cụ máy học và toán học mã nguồn mở cho Dữ liệu lớn. Cliff đã viết trình biên dịch đầu tiên của mình khi mới 15 tuổi (Pascal to TRS Z-80. ), mặc dù trình biên dịch nổi tiếng nhất của Cliff là HotSpot Server Compiler (the Sea of ​​Nodes IR)

Giới thiệu về hội nghị

Phần mềm đang thay đổi thế giới. QCon trao quyền cho phát triển phần mềm bằng cách tạo điều kiện phổ biến kiến ​​thức và đổi mới trong cộng đồng nhà phát triển. Một hội nghị hướng đến người thực hành, QCon được thiết kế cho các trưởng nhóm kỹ thuật, kiến ​​trúc sư, giám đốc kỹ thuật và quản lý dự án, những người có ảnh hưởng đến sự đổi mới trong nhóm của họ

Hội nghị phát triển phần mềm. Ngày 27-29 tháng 3 năm 2023

Tôi làm việc trong ngành này, tôi làm việc này hàng ngày và mỗi lần đến QCon, tôi lại học được những điều mới mà tôi muốn mang về cho đội của mình

Bài viết này khảo sát một số điểm chuẩn và nhận thấy rằng hiệu suất của Java trên mã số có thể so sánh với hiệu suất của C++, với gợi ý rằng hiệu suất tương đối của Java đang tiếp tục được cải thiện. Sau đó, chúng tôi mô tả các lý do lý thuyết rõ ràng tại sao các kết quả điểm chuẩn này nên được mong đợi

điểm chuẩn

Năm điểm chuẩn tổng hợp được liệt kê bên dưới cho thấy Java hiện đại có hiệu suất chấp nhận được, gần bằng (và trong nhiều trường hợp nhanh hơn) C/C++ trên một số điểm chuẩn
  1. hạt nhân số

    So sánh Java với C và Fortran cho các ứng dụng khoa học
    Mark Bull, Lorna Smith, Lindsay Pottage, Robin Freeman,
    EPCC, Đại học Edinburgh ( .

    Nhóm tác giả thử nghiệm một số mã số thực (FFT, Matrix factorization, SOR, bộ giải chất lỏng, N-body) trên một số kiến ​​trúc và trình biên dịch. Trên Intel, họ thấy rằng hiệu suất Java rất hợp lý so với C (e. g, chậm hơn 20%) và Java đó nhanh hơn ít nhất một trình biên dịch C (trình biên dịch KAI trên Linux)

    Các tác giả kết luận, "Trên phần cứng Intel Pentium, đặc biệt là với Linux, khoảng cách hiệu năng đủ nhỏ để các lập trình viên ít hoặc không quan tâm. "

  2. Các phương pháp số khác. Điểm SciMark2

    Điểm chuẩn scimark2 của Viện Tiêu chuẩn Quốc gia có sẵn trong các phiên bản C# java, C và (bên thứ ba). Nó bao gồm FFT, thư giãn Jacobi cho phương trình Laplace 2D, ước tính PI Monte Carlo, nhân ma trận thưa thớt và LU

    Java nhanh hơn một chút so với C trên điểm chuẩn này. Mflops (cao hơn là tốt hơn)

    java1. 8. 0_601178gcc 4. 8. 3 -O3959
    ./scimark2 	#gcc4.8.3 -O3
    ** **
    ** SciMark2 Numeric Benchmark, see http://math.nist.gov/scimark **
    ** for details. (Results can be submitted to [email protected])     **
    ** **
    Using       2.00 seconds min time per kenel.
    Composite Score:          959.60
    FFT             Mflops:  1002.44    (N=1024)
    SOR             Mflops:   809.64    (100 x 100)
    MonteCarlo:     Mflops:   353.20
    Sparse matmult  Mflops:  1012.14    (N=1000, nz=5000)
    LU              Mflops:  1620.57    (M=100, N=100)
    
    java -server jnt.scimark2.commandline	#java version "1.8.0_60"
    SciMark 2.0a
    Composite Score: 1178.7765479267096
    FFT (1024): 559.7691512301901
    SOR (100x100):   1068.4529791414395
    Monte Carlo : 540.5194437616267
    Sparse matmult (N=1000, nz=5000): 1009.4109039057408
    LU (100x100): 2715.730261594551
    
    
  3. Vẫn còn nhiều phương pháp số

    Từ cuốn sách Triển khai hướng đối tượng các phương pháp số của Didier Besset (MorganKaufmann, 2001). OperationUnitsCSmalltalkJavaĐa thức bậc 10msec. 1. 127. 79. 0Nội suy Neville (20 điểm)msec. 0. 911. 00. Đảo ngược ma trận 8LUP (100 x 100) giây. 3. 922. 91. 0
  4. Microbenchmarks (đã xem xét hiệu ứng bộ đệm)

    Vài năm trước, các điểm chuẩn này cho thấy hiệu suất java vào thời điểm đó ở đâu đó ở giữa hiệu suất của trình biên dịch C - nhanh hơn trình biên dịch C tồi tệ nhất, chậm hơn trình biên dịch C tốt nhất. Đây là những "điểm chuẩn siêu nhỏ", nhưng chúng có lợi thế là chúng được chạy trên một số kích thước vấn đề khác nhau và do đó, kết quả không phản ánh tương tác bộ đệm may mắn (xem thêm chi tiết về vấn đề này trong phần tiếp theo)

    Các điểm chuẩn này đã được cập nhật với phiên bản mới hơn java(1. 4) và gcc(3. 2), sử dụng tối ưu hóa đầy đủ (gcc -O3 -mcpu=pentiumpro -fexpensive-optimizations -fschedule-insns2. ). Lần này java nhanh hơn C trong phần lớn các bài kiểm tra, với hệ số hơn 2 trong một số trường hợp

    gợi ý rằng hiệu suất java đang bắt kịp hoặc thậm chí vượt xa gcc ít nhất

    Các thử nghiệm này chủ yếu là số nguyên (ngoại trừ FFT)

  5. Microbenchmarks (hiệu ứng bộ đệm không được xem xét)

    Vào tháng 1 năm 2004 OSNews. com đã đăng một bài báo, Cửu Ngôn Biểu Diễn Round-up. Điểm chuẩn Toán & Tệp I-O. Đây là các vòng lặp I/O số và tệp đơn giản và chắc chắn phải chịu yếu tố tương tác bộ đệm tùy ý được mô tả bên dưới. Tuy nhiên, chúng được chạy dưới một số trình biên dịch khác nhau, giúp. Một lần nữa, Java cạnh tranh với (thực sự nhanh hơn một chút so với) một số trình biên dịch C++ bao gồm Visual C++ trong phần lớn các điểm chuẩn

    (Một cuộc gọi thư viện lượng giác được kiểm tra điểm chuẩn đặc biệt. Các lập trình viên số Java biết rằng các cuộc gọi này trở nên chậm hơn trong java 1. 4; . 4. 2)

Lưu ý rằng các điểm chuẩn này là trên các máy kiến ​​​​trúc Intel. Trình biên dịch Java trên một số bộ xử lý khác hiện tại kém phát triển hơn

Và trên lý thuyết. Có lẽ Java nên nhanh hơn

Những người ủng hộ Java đã tuyên bố rằng Java sẽ sớm nhanh hơn C. Tại sao?

1) Con trỏ khiến việc tối ưu hóa trở nên khó khăn

Đây là lý do tại sao C thường chậm hơn một chút so với Fortran

Trong C, xem xét mã

        x = y + 2 * (...)
        *p = ...
	arr[j] = ...
        z = x + ...
Bởi vì p có thể trỏ đến x, nên trình biên dịch C không thể giữ x trong sổ đăng ký và thay vào đó phải ghi nó vào bộ đệm và đọc lại -- trừ khi nó có thể tìm ra vị trí p đang trỏ vào thời điểm biên dịch. Và bởi vì mảng hoạt động giống như con trỏ trong C/C++, nên việc gán cho các phần tử mảng cũng vậy. arr[j] cũng có thể sửa đổi x

Vấn đề con trỏ này trong C giống với vấn đề kiểm tra giới hạn mảng trong Java. trong cả hai trường hợp, nếu trình biên dịch có thể xác định chỉ mục mảng (hoặc con trỏ) tại thời điểm biên dịch thì nó có thể tránh được sự cố

Ví dụ, trong vòng lặp bên dưới, trình biên dịch Java có thể tránh kiểm tra giới hạn mảng thấp hơn một cách tầm thường vì bộ đếm vòng lặp chỉ tăng lên, không bao giờ giảm đi. Một bài kiểm tra duy nhất trước khi bắt đầu vòng lặp sẽ xử lý bài kiểm tra giới hạn trên nếu 'len' không được sửa đổi bên trong vòng lặp (và java không có con trỏ, vì vậy chỉ cần tìm kiếm một phép gán là đủ để xác định điều này)

   for( int i = 0; i < len; i++ ) { a[i] = .. }

Trong trường hợp trình biên dịch không thể xác định thông tin cần thiết tại thời điểm biên dịch, vấn đề về con trỏ C thực sự có thể là tác động lớn hơn đến hiệu suất. Trong trường hợp java, (các) giới hạn vòng lặp có thể được giữ trong thanh ghi và chỉ mục chắc chắn nằm trong thanh ghi, do đó cần kiểm tra thanh ghi-thanh ghi. Trong trường hợp C/C++, cần tải từ bộ nhớ

2) Thu gom rác- còn tệ hơn không. hoặc tốt hơn?

Hầu hết các lập trình viên nói rằng việc thu gom rác đang hoặc nên chậm mà không có lý do cụ thể - điều này được giả định nhưng chưa bao giờ được thảo luận. Một số nhà nghiên cứu ngôn ngữ máy tính nói khác

Xem xét điều gì sẽ xảy ra khi bạn thực hiện new/malloc. a) trình cấp phát tìm kiếm một vị trí trống có kích thước phù hợp, sau đó trả về cho bạn một con trỏ. b) Con trỏ này đang trỏ đến một địa điểm khá ngẫu nhiên

Với GC, a) bộ cấp phát không cần tìm kiếm bộ nhớ, nó biết vị trí của nó, b) bộ nhớ mà nó trả về liền kề với bit bộ nhớ cuối cùng mà bạn yêu cầu. Phần lang thang không phải lúc nào cũng xảy ra mà chỉ khi thu gom rác. Và sau đó (tùy thuộc vào thuật toán GC), tất nhiên mọi thứ cũng được di chuyển

Chi phí thiếu bộ đệm

Lợi ích lớn của GC là địa phương bộ nhớ. Bởi vì bộ nhớ mới được cấp phát liền kề với bộ nhớ được sử dụng gần đây nên nhiều khả năng nó đã nằm trong bộ đệm

Điều này có bao nhiêu tác dụng? . thay đổi kích thước mảng trong chương trình C nhỏ từ 1023 thành 1024 dẫn đến chậm 17 lần (không phải 17%). Điều này giống như chuyển từ C sang VB. Chương trình cụ thể này đã tình cờ phát hiện ra tương tác bộ đệm có lẽ là tồi tệ nhất có thể xảy ra đối với bộ xử lý cụ thể đó (MIPS); . nhưng với tốc độ bộ xử lý tăng nhanh hơn bộ nhớ, việc thiếu bộ đệm có lẽ là một chi phí thậm chí còn lớn hơn so với trước đây

(Thật dễ dàng tìm thấy các nghiên cứu khác chứng minh điều này; đây là một nghiên cứu từ Princeton. họ phát hiện ra rằng các chương trình ML (thu gom rác) được dịch từ điểm chuẩn SPEC92 có tỷ lệ lỗi bộ đệm thấp hơn so với các chương trình C và Fortran tương đương. )

Đây là lý thuyết, còn thực hành thì sao? . Trình thu gom rác nhanh như một malloc/free điển hình; . Một sự thật thú vị khác là chi phí của malloc/miễn phí là đáng kể. cả perl và ghostscript đều dành khoảng 25-30% thời gian cho các cuộc gọi này

Bên cạnh hành vi bộ đệm được cải thiện, cũng lưu ý rằng quản lý bộ nhớ tự động cho phép phân tích thoát, xác định phân bổ cục bộ có thể được đặt trên ngăn xếp. (Phân bổ ngăn xếp rõ ràng rẻ hơn so với phân bổ theo đống)

3) Biên dịch thời gian chạy

Trình biên dịch JIT biết nhiều hơn một "trình biên dịch trước" thông thường và nó có thể thực hiện công việc tốt hơn nếu có thêm thông tin
  • Trình biên dịch biết nó đang chạy trên bộ xử lý nào và có thể tạo mã cụ thể cho bộ xử lý đó. Nó biết (ví dụ) bộ xử lý là PIII hay P4, nếu có SSE2 và dung lượng bộ đệm. Mặt khác, một trình biên dịch trước phải nhắm mục tiêu bộ xử lý có mẫu số chung nhỏ nhất, ít nhất là trong trường hợp phần mềm thương mại
  • Vì trình biên dịch biết lớp nào thực sự được tải và được gọi, nên nó biết phương thức nào có thể được ảo hóa và nội tuyến hóa. (Đáng chú ý, các trình biên dịch java hiện đại cũng biết cách "dịch ngược" các lệnh gọi nội tuyến trong trường hợp một phương thức ghi đè được tải sau khi quá trình biên dịch JIT diễn ra. )
  • Trình biên dịch động cũng có thể nhận được gợi ý dự đoán nhánh thường xuyên hơn trình biên dịch tĩnh

Cũng có thể lưu ý rằng Microsoft có một số nhận xét tương tự về hiệu suất C# [5]

  • "Chuyện hoang đường. Các chương trình JITed thực thi chậm hơn các chương trình biên dịch sẵn"
  • NET vẫn cung cấp ngen tiền biên dịch truyền thống. exe, nhưng "vì không thể cung cấp các tối ưu hóa chỉ trong thời gian chạy. mã thường không tốt bằng mã do JIT bình thường tạo ra. "

Các vấn đề về tốc độ và điểm chuẩn

Điểm chuẩn thường dẫn đến thảo luận rộng rãi và sôi nổi trong các diễn đàn web phổ biến. Theo quan điểm của chúng tôi, có một số lý do tại sao các cuộc thảo luận như vậy chủ yếu là "không khí sôi nổi"

Thế nào là chậm?

Khái niệm "chậm" trong các cuộc thảo luận phổ biến thường được hiệu chỉnh kém. Nếu bạn viết một số điểm chuẩn nhỏ bằng một số loại ngôn ngữ lập trình khác nhau, thì cái nhìn bao quát về hiệu suất có thể giống như thế này. Lớp ngôn ngữ làm chậm điển hìnhAssembler. 1Biên dịch cấp thấp (Fortran, C). Mã 1-2Byte (trăn). 25-50Chuỗi được giải thích (csh, tcl?). 250x

Bất chấp bức tranh toàn cảnh này, sự khác biệt về hiệu suất nhỏ hơn hệ số hai thường được coi là bằng chứng trong các cuộc tranh luận về tốc độ. Như chúng tôi mô tả tiếp theo, sự khác biệt từ 2x-4x trở lên thường chỉ là tiếng ồn

Không mô tả tốc độ của một ngôn ngữ dựa trên một điểm chuẩn duy nhất của một chương trình

Chúng ta thường thấy mọi người rút ra kết luận từ một điểm chuẩn duy nhất. Ví dụ, một bài viết được đăng trên slashdot. org [3] tuyên bố sẽ giải quyết câu hỏi "Ngôn ngữ lập trình nào cung cấp công cụ nhanh nhất để xử lý số trong Linux?", nhưng nó chỉ thảo luận về một chương trình

Tại sao một chương trình không đủ tốt?

Đối với một, đó là lẽ thường; . Bộ điểm chuẩn thứ tư ở trên cho thấy Java nhanh hơn C theo hệ số hai trên FFT của một mảng có kích thước cụ thể. Bây giờ bạn có nên tuyên bố rằng Java luôn nhanh gấp đôi C không?

Tuy nhiên, có một vấn đề quan trọng hơn chất lượng mã trên điểm chuẩn cụ thể

Hiệu ứng bộ nhớ đệm/bộ nhớ

Nhìn vào tiêu chuẩn vi mô FFT mà chúng tôi đã tham khảo ở trên. Con số được sao chép ở đây với sự cho phép

Trên chương trình đơn lẻ này, tùy thuộc vào kích thước đầu vào, hiệu suất tương đối của 'IBM' (IBM's Java) thay đổi từ chậm khoảng hai lần đến nhanh gấp đôi so với 'max-C' (gcc) (-O3 -lm -s -static . Vì vậy, những gì chúng ta kết luận từ điểm chuẩn này?

Biến thể hiệu suất này do các yếu tố về vị trí và kích thước dữ liệu là phổ biến. Một ví dụ ấn tượng hơn về các hiệu ứng bộ đệm như vậy là liên kết được đề cập trong cuộc thảo luận về thu gom rác ở trên

Người đã đăng [3] đã chứng minh sự mong manh của điểm chuẩn của chính mình trong một bài đăng tiếp theo, viết rằng "Java hiện hoạt động tốt như gcc trong nhiều bài kiểm tra" sau khi thay đổi một số thứ (lưu ý rằng đó không phải là ngôn ngữ Java đã thay đổi)

kết luận. Tại sao "Java chậm" lại phổ biến như vậy?

Java gần bằng (hoặc nhanh hơn) C++ trên các điểm chuẩn cấp thấp và số. Điều này không có gì đáng ngạc nhiên. Java là một ngôn ngữ được biên dịch (mặc dù đã được biên dịch JIT)

Tuy nhiên, ý kiến ​​cho rằng "java chậm" được nhiều người tin tưởng. Tại sao lại như vậy có lẽ là khía cạnh thú vị nhất của bài viết này

Hãy xem xét một số lý do có thể

  • Java vào khoảng năm 1995 đã chậm. Các phiên bản đầu tiên của java không có trình biên dịch JIT java, và do đó được diễn giải mã byte (ví dụ như Python). Trình biên dịch JIT đã xuất hiện trong các JVM của Microsoft, Symantec và Java1 của Sun. 2

    Lời giải thích này là không hợp lý. Hầu hết "dân máy tính" đều có thể tính toán tốc độ chính xác tính bằng GHz của bộ xử lý mới nhất và họ theo dõi thông tin này khi nó thay đổi mỗi tháng (và đã làm như vậy trong nhiều năm). Tuy nhiên, lời giải thích này yêu cầu chúng tôi tin rằng họ không thể nhớ rằng một sự thay đổi tốc độ ngôn ngữ duy nhất và khá quan trọng đã xảy ra vào năm 1996

  • Java vẫn có thể chậm. Ví dụ: các chương trình được viết bằng lớp Vector an toàn luồng nhất thiết phải chậm hơn (ít nhất là trên một bộ xử lý) so với các chương trình được viết bằng lớp ArrayList không an toàn luồng tương đương

    Lời giải thích này cũng không thỏa mãn, bởi vì C ++ và các ngôn ngữ khác đã có "hình phạt trừu tượng" tương tự. Ví dụ: cuốn sách Thực hành lập trình của Kernighan và Pike có một bảng với các mục sau, mô tả hiệu suất của một số triển khai chương trình xử lý văn bản

    Phiên bản400 MHz PIIC0. 30 giâyC++/STL/deque11. 2 giâyC++/STL/list1. 5 giây

    Một vấn đề lịch sử khác trong C++ là chi phí trả về một đối tượng từ một hàm (có liên quan đến một số chu kỳ tạo/sao chép/hủy đối tượng không cần thiết)

  • Khởi động chương trình Java chậm. Khi một chương trình java khởi động, nó sẽ giải nén các thư viện java và biên dịch các phần của các thư viện đó và của chính nó, do đó, một chương trình tương tác có thể bị chậm trong vài giây đầu tiên sử dụng

    Cách tiếp cận này là một lời giải thích hợp lý cho huyền thoại tốc độ. Nhưng trong khi nó có thể giải thích ấn tượng của người dùng, thì nó không giải thích được tại sao nhiều lập trình viên (những người có thể dễ dàng hiểu được ý tưởng về một chương trình thông dịch đang được biên dịch) lại chia sẻ niềm tin đó.

Tôi thấy sự khác biệt giữa ý kiến ​​của lập trình viên và điểm chuẩn rất thú vị, nhưng không phải vì tôi là người ủng hộ Java. Ngược lại, mặc dù tôi nghĩ Java là ngôn ngữ thích hợp cho nội dung phần mềm trung gian mà nó thường được sử dụng và là ngôn ngữ giới thiệu rõ ràng, nhưng nó không phải là ngôn ngữ đặc biệt tốt cho số

Thay vào đó, vấn đề thúc đẩy tôi vì "thần thoại" tương tự dường như ngăn cản việc áp dụng rộng rãi các ngôn ngữ tiên tiến hơn - Tôi thích các ngôn ngữ chức năng hơn và tin rằng quan điểm "có tính năng này" của các ngôn ngữ là không phù hợp nếu có sẵn siêu lập trình đồng âm. Có một huyền thoại tương tự "thu gom rác là chậm" vẫn tồn tại bất chấp lý thuyết và hàng thập kỷ bằng chứng ngược lại [2]

Một lý do khiến bạn có thể quan tâm là quan điểm "java phải chậm" biện minh cho việc phát triển phần mềm có lỗ hổng tràn bộ đệm. Tham khảo lại phần LU của điểm chuẩn Scimark2, phần này chủ yếu liên quan đến truy cập mảng và cộng nhiều lần. rõ ràng là có thể có cả hiệu suất tốt (1. Nhanh hơn 7 lần so với C) và kiểm tra giới hạn mảng

Sự nhìn nhận

Ian Rogers, Curt Fischer và Bill Bogstad đã cung cấp thông tin đầu vào và làm rõ một số điểm

Người giới thiệu

[1] K. Reinholtz, Java sẽ nhanh hơn C++, ACM Sigplan Thông báo, 35(2). 25-28 tháng 2 năm 2000

[2] Benjamin Zorn, Chi phí đo lường được của phần mềm thu gom rác bảo thủ - Thực hành và trải nghiệm 23(7). 733-756, 1992

[3] Linux Number Crunching. Ngôn ngữ và Công cụ, được tham khảo trên dấu gạch chéo. tổ chức

[4] Christopher W. Cowell-Shah, Tổng kết trình diễn chín ngôn ngữ. Benchmarking Math & File I/O, đã xuất hiện tại OSnews. com, tháng một. 2004

[5] E. Schanzer, Cân nhắc hiệu suất cho các công nghệ thời gian chạy trong. NET Framework, bài viết về Mạng lưới nhà phát triển của Microsoft

Cái nào nhanh hơn C hay Java?

Java sử dụng các đối tượng, trong khi C sử dụng các hàm. Java dễ học và dễ sử dụng hơn vì nó ở mức cao, trong khi C có thể làm được nhiều việc hơn và hoạt động nhanh hơn vì nó gần với mã máy hơn.

Java có chậm hơn C không?

Tuy nhiên, thời gian tổng thể để thực hiện quy trình chậm hơn nhiều . Điều này làm cho việc thực thi ngôn ngữ lập trình Thông dịch rất chậm so với các ngôn ngữ biên dịch như C hoặc C++.

Tại sao Java mạnh hơn C?

Java hướng dữ liệu hơn . C là ngôn ngữ cấp trung vì sự ràng buộc của các khoảng trống diễn ra giữa ngôn ngữ cấp máy và ngôn ngữ cấp cao. Java là ngôn ngữ cấp cao vì việc dịch mã diễn ra sang ngôn ngữ máy bằng trình biên dịch hoặc trình thông dịch.

C sắc nét hay Java nhanh hơn?

Tuy nhiên, theo điểm chuẩn trên web, C# có xu hướng hoạt động tốt hơn về tổng thể . Thời gian phản hồi của nó ngắn hơn, bên cạnh việc chiếm ít tải CPU hơn. Công bằng mà nói, khi được kết hợp với trình biên dịch Just-In-Time, Java cũng cung cấp hiệu năng cao.