Java vs C++ cái nào nhanh hơn

Đây là cuộc tranh luận muôn thuở giữa lập trình viên Java và lập trình viên C/C++. Mỗi nhóm, tin rằng ngôn ngữ của họ là nhanh nhất, sẽ tranh luận sôi nổi với các đồng nghiệp của mình trong nhiều giờ

Chúng ta thực sự có thể so sánh mặc dù?

Bạn có biết điều gì làm cho ngôn ngữ của bạn nhanh hơn và trong trường hợp nào không?

Cliff Click đã nói chuyện về chủ đề này tại QCon San Francisco. 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 sự lựa chọn của họ

Xem cuộc nói chuyện (35 phút nói chuyện, 15 phút hỏi đáp)

 

Java vs C++ cái nào nhanh hơn

Java so với C/C++

C/C++ sẽ tốt hơn Java trong những trường hợp này

  • Dấu chân (ví dụ. bộ điều khiển nhúng)
  • Thời gian khởi động lại (ví dụ. máy tạo nhịp tim)
  • Định hình lại mảng khó thực hiện trong Java
  • loại giá trị
  • Truy cập máy trực tiếp (ví dụ:. trình điều khiển thiết bị, trò chơi FPS)
  • Tạo mã trực tiếp
  • Kẻ hủy diệt so với người hoàn thiện
  • Kẻ hủy diệt so với thử/cuối cùng

Mặt khác, Java sẽ đánh bại C/C++ trong những trường hợp này

  • lập hồ sơ
  • Các chương trình rất lớn
  • Thu gom rác thải
  • đa luồng
  • Các công cụ để mã hóa và gỡ lỗi song song

Sự khác biệt giữa hai ngôn ngữ lập trình có thể liên quan đến lịch sử của chúng vì chúng được thiết kế cho các mục đích khác nhau

Thông thường, việc so sánh giữa cả hai ngôn ngữ sẽ sử dụng các đối số sai. Vào cuối ngày, ngôn ngữ nào nhanh hơn?

Đây là những gì tôi đã học được sau hơn 20 năm làm việc với cả C++ và Java (và nhiều năm trước đó với C++)

  • Theo nguyên tắc thông thường, khi bạn chuyển đổi C++ được tối ưu hóa sang Java, mã sẽ chậm hơn khoảng 3 lần
  • Theo nguyên tắc thông thường, khi bạn chuyển đổi Java sang C++, mã sẽ chậm hơn khoảng 3 lần. Điều này ban đầu không có ý nghĩa gì, cho đến khi bạn cho rằng mã được viết bằng Java được "điều chỉnh" theo cách mã Java có xu hướng được viết, đó hoàn toàn không phải là cách mà bất kỳ ai làm việc trong C++ sẽ cấu trúc mã C++
  • Cấu trúc dữ liệu đồng thời có xu hướng hiệu quả hơn trong Java, bởi vì JVM có thể loại bỏ các rào cản bộ nhớ và đồng bộ hóa khi cấu trúc dữ liệu không được sử dụng đồng thời và có thể làm sai lệch phương pháp quản lý đồng thời dựa trên thông tin cấu hình thời gian chạy
  • Quản lý bộ nhớ động có xu hướng hiệu quả hơn trong Java, đặc biệt là nó càng bị lạm dụng nhiều hơn và đặc biệt là trong các hệ thống đa luồng
  • Nội tuyến có xu hướng tốt hơn nhiều trong Java, trừ khi bạn thực hiện các tối ưu hóa dựa trên trình lược tả mở rộng trong C++ (hoặc biết chính xác nội tuyến là gì và buộc nó phải như vậy. phải yêu những tập tin tiêu đề đó. )
  • Các dự án lớn có xu hướng dễ dàng tối ưu hóa hơn trong Java, bởi vì JVM xử lý nhiều tối ưu hóa "toàn cầu" (chẳng hạn như khả năng nội tuyến mã được tải động) cho nhà phát triển

Trong trường hợp nào thì Java nhanh hơn, nếu có, so với C++?. ban đầu xuất hiện trên Quora. Câu trả lời tốt nhất cho bất kỳ câu hỏi. Đặt một câu hỏi, nhận được một câu trả lời tuyệt vời. Học hỏi từ các chuyên gia và tiếp cận kiến ​​thức nội bộ. Bạn có thể theo dõi Quora trên Twitter, Facebook và Google+. thêm câu hỏi

Khi nói đến việc phát triển các hệ thống phần mềm có độ trễ thấp, điều khôn ngoan nhận được là bạn sẽ phát điên khi sử dụng bất kỳ thứ gì ngoại trừ C++ vì mọi thứ khác đều có độ trễ quá cao. Nhưng tôi ở đây để thuyết phục bạn về quan niệm ngược lại, phản trực giác, gần như dị giáo. rằng khi nói đến việc đạt được độ trễ thấp trong các hệ thống phần mềm, Java sẽ tốt hơn

Java vs C++ cái nào nhanh hơn

Theodoros 'Theo' Karasavvas

Là nhà phát triển, tất cả chúng ta đều biết có hai cách để làm mọi việc. cách thủ công, chậm chạp, khó chịu, phức tạp và cách tự động, nhanh chóng và thậm chí còn phức tạp hơn.  

Ví dụ, tôi có thể tiếp tục viết bài này về lý do tại sao bạn nên sử dụng Java thay vì C++ cho các hệ thống có độ trễ thấp. Tôi có thể bắt đầu đào tạo AI để viết nó cho tôi. Cuối cùng, cách tiếp cận thứ hai sẽ giúp tôi tiết kiệm rất nhiều thời gian viết bài—nó có thể tạo ra hàng nghìn bài báo mỗi giây—nhưng biên tập viên của tôi có lẽ sẽ không vui khi biết rằng tôi sẽ mất hai năm để viết bài báo đầu tiên.

Có một tình huống tương tự khi phát triển các hệ thống phần mềm có độ trễ thấp. Sự khôn ngoan nhận được là bạn sẽ phát điên khi sử dụng bất cứ thứ gì ngoài C++ vì mọi thứ khác đều có độ trễ quá cao. Nhưng tôi ở đây để thuyết phục bạn về quan niệm ngược lại, phản trực giác, gần như dị giáo. rằng khi nói đến việc đạt được độ trễ thấp trong các hệ thống phần mềm, Java sẽ tốt hơn

Trong bài viết này, tôi muốn lấy một ví dụ cụ thể về phần mềm được đánh giá cao về độ trễ thấp; . Tuy nhiên, các đối số tôi đưa ra ở đây có thể được áp dụng cho hầu hết mọi trường hợp trong đó yêu cầu hoặc mong muốn độ trễ thấp. Chỉ là thảo luận vấn đề này liên quan đến lĩnh vực phát triển mà tôi có kinh nghiệm sẽ dễ dàng hơn. Và sự thật là độ trễ có thể là một thứ khó đo lường

Tất cả bắt nguồn từ định nghĩa của bạn về “độ trễ thấp. " Hãy để tôi giải thích…

Trí tuệ nhận được

Hãy bắt đầu bằng cách xem xét lý do tại sao bạn nên chọn C++ để xây dựng các hệ thống tốc độ cao, độ trễ thấp.  

Vì C ++ gần với kim loại hơn, nên hầu hết các nhà phát triển sẽ nói với bạn, có một lợi thế về tốc độ vốn có để viết mã bằng ngôn ngữ này. Trong các tình huống có độ trễ thấp, chẳng hạn như giao dịch tốc độ cao, trong đó micro giây có thể tạo ra sự khác biệt giữa một phần mềm khả thi và sự lãng phí dung lượng đĩa lỗi thời, C++ được coi là tiêu chuẩn vàng

Hoặc ít nhất nó đã từng, ngày xửa ngày xưa. Thực tế là ngày nay, rất nhiều ngân hàng và nhà môi giới lớn sử dụng các hệ thống được viết bằng Java. Và ý tôi là viết bằng Java—chứ không phải viết bằng Java và sau đó được diễn giải thành C++ để đạt được độ trễ thấp hơn. Các hệ thống này đang trở thành tiêu chuẩn, ngay cả đối với các ngân hàng đầu tư cấp 1, mặc dù thực tế là chúng (được cho là) ​​chậm hơn

Vì vậy những gì đang xảy ra?

Chà, C ++ có thể là "độ trễ thấp" khi nói đến việc thực thi mã, nhưng nó chắc chắn không phải là độ trễ thấp khi tung ra các tính năng mới hoặc thậm chí tìm kiếm các nhà phát triển có thể viết nó.  

Sự khác biệt (thực tế) giữa Java và C++

Tuy nhiên, vấn đề về thời gian phát triển này mới chỉ là khởi đầu khi nói đến sự khác biệt thực sự giữa Java và C++ trong các hệ thống thế giới thực. Vì vậy, để hiểu giá trị thực sự của từng ngôn ngữ trong ngữ cảnh này, hãy giải nén chúng một chút

Đầu tiên, điều quan trọng cần nhớ là lý do thực sự khiến C++ nhanh hơn Java trong hầu hết các trường hợp. một con trỏ C++ là địa chỉ của một biến trong bộ nhớ. Điều đó có nghĩa là phần mềm có thể truy cập trực tiếp vào các biến riêng lẻ và không cần phải chạy qua các bảng tốn kém tính toán để tìm thấy chúng. Hoặc ít nhất là có thể nếu nó được cho biết vị trí của chúng—bởi vì với C++, bạn thường sẽ phải quản lý rõ ràng thời gian tồn tại và quyền sở hữu của các đối tượng.  

Kết quả cuối cùng của điều này là trừ khi bạn thực sự, thực sự giỏi viết nó (một kỹ năng có thể mất hàng thập kỷ để thành thạo), C++ sẽ cần hàng giờ (hoặc hàng tuần) để sửa lỗi. Và, như bất kỳ ai đã cố gắng gỡ lỗi công cụ Monte Carlo hoặc bộ giải PDE sẽ cho bạn biết, việc cố gắng gỡ lỗi truy cập bộ nhớ ở cấp độ cơ bản có thể cực kỳ tốn thời gian. Chỉ riêng một con trỏ bị hỏng có thể dễ dàng làm sập toàn bộ hệ thống, vì vậy việc vận chuyển một phiên bản mới được viết bằng C++ có thể thực sự đáng sợ

Đây không phải là toàn bộ câu chuyện, tất nhiên. Những người thích viết mã bằng C++ (cả ba người họ) sẽ chỉ ra rằng trình thu gom rác (GC) trong Java bị tăng đột biến độ trễ phi tuyến tính. Đây là trường hợp đặc biệt khi làm việc với các hệ thống cũ và do đó, việc gửi các bản cập nhật cho mã Java, trong khi không phá vỡ hệ thống của khách hàng của bạn, có thể khiến chúng chậm đến mức không sử dụng được

Để đáp lại, tôi sẽ chỉ ra rằng rất nhiều công việc đã được thực hiện để giảm độ trễ do Java GC tạo ra trong thập kỷ qua. Chẳng hạn, LMAX Disruptor là một nền tảng giao dịch có độ trễ thấp được viết bằng Java nhưng cũng được xây dựng dưới dạng một khung có “sự đồng cảm cơ học” đối với phần cứng mà nó đang chạy trên đó và không bị khóa.  

Các vấn đề có thể được giảm thiểu hơn nữa nếu bạn đang xây dựng một hệ thống sử dụng quy trình tích hợp và phân phối liên tục (CI/CD), vì CI/CD cho phép triển khai tự động các thay đổi mã đã kiểm tra. Điều này là do CI/CD cho phép một cách tiếp cận lặp đi lặp lại để cải thiện độ trễ của GC, trong đó Java có thể được cải thiện dần dần và điều chỉnh cho phù hợp với các môi trường phần cứng cụ thể mà không cần quá trình chuẩn bị mã cho các thông số kỹ thuật phần cứng khác nhau trước khi vận chuyển.  

Vì hỗ trợ IDE cho Java tiên tiến hơn nhiều so với C++, nên hầu hết các môi trường (Eclipse, IntelliJ, IDEA) sẽ có thể cấu trúc lại Java. Điều này có nghĩa là hầu hết các IDE sẽ cho phép bạn tối ưu hóa mã để chạy với độ trễ thấp, một khả năng vẫn còn hạn chế khi làm việc với C++.  

Ngay cả khi nó không hoàn toàn phù hợp với C++ về hiệu suất thô, thì hầu hết các nhà phát triển sẽ có thể đạt được hiệu suất chấp nhận được trong Java dễ dàng hơn nhiều so với trong C++. Kẻ giết người độ trễ thực sự đến từ việc có một ý tưởng và vận chuyển mã cho nó.  

Chúng ta có ý nghĩa gì bởi nhanh hơn?

Trên thực tế, có lý do chính đáng để nghi ngờ ý kiến ​​cho rằng C++ thực sự “nhanh hơn” hoặc có “độ trễ thấp hơn” so với Java. Tại thời điểm này, tôi biết rằng mình đang rơi vào một vùng nước khá âm u và nhiều nhà phát triển có thể bắt đầu đặt câu hỏi về sự tỉnh táo của tôi. Nhưng hãy nghe tôi nói

Đầu tiên, có một điểm (hơi vô lý) là nếu bạn có hai nhà phát triển, một người viết bằng C++ và một người viết bằng Java, và bạn yêu cầu họ viết một nền tảng cho giao dịch tốc độ cao từ đầu, thì nhà phát triển Java sẽ giao dịch lâu dài. . Đối với các nhà phát triển chưa sử dụng cả hai ngôn ngữ, đây là lý do tại sao. Java có ít trường hợp hành vi không xác định hơn nhiều so với C++. Chỉ lấy một ví dụ, lập chỉ mục bên ngoài giới hạn của một mảng là một lỗi trong cả Java và C++. Nếu bạn vô tình làm điều này trong C++, bạn có thể bị lỗi phân tách hoặc (phổ biến hơn) bạn sẽ nhận lại một số ngẫu nhiên không có ý nghĩa gì, ngay cả với các nhà phát triển có kinh nghiệm. Trong Java, việc lập chỉ mục vượt quá giới hạn luôn tạo ra một lỗi ArrayIndexOutOfBoundsException. Điều này có nghĩa là việc gỡ lỗi dễ dàng hơn nhiều trong Java, bởi vì các lỗi có xu hướng gây ra lỗi ngay lập tức và vị trí của lỗi dễ theo dõi hơn.   

Ngoài ra, và ít nhất là theo kinh nghiệm của tôi, Java (trong hầu hết các môi trường) đơn giản là tốt hơn trong việc nhận ra đoạn mã nào không cần chạy và đoạn mã nào quan trọng để phần mềm của bạn hoạt động. Tất nhiên, bạn có thể dành nhiều ngày để điều chỉnh mã C++ của mình để nó hoàn toàn không chứa mã ngoại lai, nhưng trong thế giới thực, mọi phần mềm đều chứa một số phần mở rộng và Java sẽ tự động nhận ra mã đó tốt hơn.

Điều này có nghĩa là, trong thế giới thực, Java thường nhanh hơn C++, ngay cả trên các phép đo độ trễ tiêu chuẩn. Và ngay cả khi không, sự khác biệt về độ trễ giữa các ngôn ngữ thường bị lấn át bởi các yếu tố khác hoặc không đủ lớn để tạo ra sự khác biệt, ngay cả trong giao dịch tần suất cao. Ví dụ, phần lớn đã được thực hiện để giảm độ trễ của mạng 5G—xuống còn 1ms, theo một số nhà phân tích—nhưng trong lập trình có độ trễ thấp, điều này vẫn thể hiện chi phí hiệu suất đáng kể.  

Ưu điểm của Java đối với các hệ thống có độ trễ thấp

Theo tôi, tất cả những yếu tố này tạo thành một trường hợp khá khó sử dụng để sử dụng Java để viết các nền tảng giao dịch tốc độ cao (và thực sự là các hệ thống có độ trễ thấp nói chung, sẽ sớm nói thêm về điều đó).  

Tuy nhiên, để gây ảnh hưởng thêm một chút đến những người đam mê C++, chúng ta hãy điểm qua một số lý do bổ sung để sử dụng Java

  • Đầu tiên, và như chúng ta đã thấy ở trên, bất kỳ độ trễ dư thừa nào mà Java đưa vào phần mềm của bạn có thể sẽ nhỏ hơn nhiều so với độ trễ giảm hiện tại, chẳng hạn như độ trễ giao tiếp mạng, trong (ít nhất) một trong các hệ thống giao dịch phải hoạt động . Điều này có nghĩa là bất kỳ mã Java (được viết tốt) nào cũng có thể dễ dàng hoạt động tốt như C++ trong hầu hết các tình huống giao dịch
  • Thời gian phát triển của Java ngắn hơn cũng có nghĩa là, trong thế giới thực, phần mềm được viết bằng Java có thể thích nghi nhanh hơn với việc thay đổi phần cứng (hoặc thậm chí là các chiến lược giao dịch mới) so với C++
  • Tìm hiểu sâu hơn về điều này và bạn sẽ thấy rằng ngay cả việc tối ưu hóa phần mềm Java cũng có thể nhanh hơn—nếu được xem xét trên toàn bộ phần mềm—so với tác vụ tương đương trong C++. Như Peter Lawrey, một nhà tư vấn Java quan tâm đến độ trễ thấp và độ xuyên suốt cao của hệ thống, đã nói với InfoQ gần đây, “nếu ứng dụng của bạn dành 90% thời gian cho 10% mã của bạn, thì Java sẽ khiến việc tối ưu hóa 10% đó khó hơn, nhưng viết và duy trì 90% thời gian. . ”

Nói cách khác, có thể viết Java, từ cấp độ máy trở lên, với độ trễ thấp. Bạn chỉ cần viết nó giống như C++, có lưu ý đến việc quản lý bộ nhớ ở từng giai đoạn phát triển. Ưu điểm của việc không viết bằng C ++ là việc gỡ lỗi, phát triển nhanh và thích ứng với nhiều môi trường đơn giản là dễ dàng hơn và nhanh hơn trong Java

Vậy thì sao?

Nếu bạn đã đạt được điều này và bạn không phát triển các hệ thống giao dịch có độ trễ thấp, bạn có thể tự hỏi liệu có bất kỳ điều nào ở trên áp dụng cho bạn không. Câu trả lời—với một vài ngoại lệ—là có.  

Cuộc tranh luận về cách đạt được độ trễ thấp không phải là một vấn đề mới và nó không phải là duy nhất đối với thế giới tài chính. Vì lý do này, có thể học được những bài học quý giá về các tình huống khác từ nó. Đặc biệt, lập luận ở trên—rằng Java “tốt hơn” bởi vì nó linh hoạt hơn, linh hoạt hơn và cuối cùng là phát triển và bảo trì nhanh hơn—có thể được áp dụng cho nhiều lĩnh vực phát triển phần mềm

Lý do tại sao tôi (cá nhân) thích viết các hệ thống có độ trễ thấp bằng Java cũng giống như những lý do đã làm cho ngôn ngữ này thành công như vậy trong 25 năm qua. Java rất dễ viết, biên dịch, gỡ lỗi và học hỏi, điều này có nghĩa là bạn có thể dành ít thời gian hơn để viết mã và có nhiều thời gian hơn để tối ưu hóa độ trễ của nó. Cuối cùng, trong thế giới thực, điều này dẫn đến các hệ thống giao dịch nhanh hơn một cách đáng tin cậy. Và, đối với giao dịch tốc độ cao, đó là tất cả những gì quan trọng

Thẻ. c ++, java, độ trễ

Java vs C++ cái nào nhanh hơn
se-stackoverflow Ngày 12 tháng 8 năm 2022

Cuộc trò chuyện với Spencer Kimball, người tạo ra GIMP và CockroachDB (Ep. 472)

Spencer Kimball, đồng sáng lập và Giám đốc điều hành của Cockroach Labs và đồng sáng tạo trình chỉnh sửa hình ảnh GIMP, nói với Ryan và Ceora về cách công nghệ cơ sở dữ liệu đã phát triển để xử lý khối lượng dữ liệu khổng lồ, cách phòng thí nghiệm Cockroach tập trung vào giải quyết các vấn đề về độ trễ thông qua công nghệ không có máy chủ và

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

Thời gian khởi động Java thường chậm hơn nhiều so với nhiều ngôn ngữ, bao gồm C, C++, Perl hay Python , bởi vì nhiều lớp (và trước hết là các lớp từ thư viện lớp nền tảng) phải .

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

Bảng so sánh hiệu suất C# và Java

Ngôn ngữ nào nhanh hơn C hoặc C ++ hoặc Java?

Hiệu suất C++. Ngược lại, một chương trình viết bằng C++ được biên dịch trực tiếp thành mã máy -- không cần dịch trung gian khi chạy. Đây là một lý do tại sao Các chương trình C++ có xu hướng hoạt động nhanh hơn các chương trình viết bằng Java .

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

Về tốc độ, Java nhanh hơn Python vì đây là ngôn ngữ được biên dịch. Mất ít thời gian hơn để thực thi mã. Python là một ngôn ngữ được giải thích và nó xác định loại dữ liệu trong thời gian chạy khiến nó chậm hơn tương đối.