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
thích dấu trang Xem bản trình bày
Tốc độ, vận tốc
Tải xuống
48. 38 Bản tóm tắtCliff 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ọcCliff 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 2023Tô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ẩnNă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
Và trên lý thuyết. Có lẽ Java nên nhanh hơnNhữ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 FortranTrong 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ácXem 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ộ đệmLợ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ạyTrì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
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]
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?). 250xBấ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ìnhChú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ìnhTạ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ể
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ậnIan Rogers, Curt Fischer và Bill Bogstad đã cung cấp thông tin đầu vào và làm rõ một số điểmNgườ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. |