Chọn C ++ hoặc Java cho các ứng dụng cần dung lượng RAM lớn? [đóng cửa]


11

Tôi đang nghĩ về các ứng dụng khoa học chủ yếu liên quan đến bộ xử lý và nặng về sử dụng heap (ít nhất là vài gigabyte). Bất kỳ thời điểm nào khác trong năm tôi đều vui vẻ đi cùng với C ++, nhưng trong trường hợp này tôi tự hỏi liệu sự phân mảnh tự nhiên đối với trình quản lý bộ nhớ C ++ có thể là một vấn đề nghiêm trọng so với lợi thế của các trình thu thập nén của Java.

Bất cứ ai cũng có thể chỉ ra các ví dụ thực tế liên quan đến điều này?


Tôi không nghĩ rằng ngôn ngữ cũng quan trọng như lập trình trong trường hợp này. Bất kỳ ngôn ngữ trưởng thành nào cũng có thể hoạt động tùy thuộc vào quy mô tính toán của bạn. Có Javas, C / C ++, thậm chí cả Pythons và Rubies có thể trượt vào vai trò này. Một số sẽ khó hơn những người khác vì có vẻ như bạn thực sự cần phải có một sự đảm bảo chắc chắn rằng bạn không bị rò rỉ bộ nhớ.
Giàn khoan

2
Nếu bạn có thể nhận được một GB với giá 7,99 đô la, đó có phải là vấn đề không? Kingston 1GB DDR3
Bo Persson

2
@BoPersson, theo kinh nghiệm của tôi, những người gặp phải những vấn đề như vậy bắt đầu bằng cách điền đầy đủ bo mạch chủ cao cấp của họ và phàn nàn rằng họ không thể đặt ở đó nhiều như họ muốn, sau đó cung cấp dữ liệu lớn nhất có thể quản lý được và sau đó phàn nàn rằng nó không đủ
Lập trình viên

@dsign, trong những ngày này, nơi bạn có thể nhận được bo mạch chủ chấp nhận vài trăm hợp đồng bộ nhớ với giá dưới 1000 €, một vài gig không quá nặng trong việc sử dụng bộ nhớ.
Lập trình viên

1
Đồng ý với phần bộ nhớ giá rẻ. Về phần phát triển, tôi đã ở C ++ được một thời gian và các thực hành mã hóa tốt làm cho rò rỉ trở thành một hiện tượng khá không thường xuyên; như một vấn đề thực tế, tôi thực sự thích C ++ hơn java về vấn đề đó.
DSign

Câu trả lời:


11

Nếu bạn đang nói về một ứng dụng bị ràng buộc để nhấn mạnh các giới hạn của máy, như bạn mong đợi, bạn sẽ thực hiện các thủ thuật lập trình để tránh vượt quá các giới hạn đó, thì C ++ là cách tốt nhất. C ++ không chỉ cung cấp cho bạn khả năng tối ưu hóa khi Java không, (như Emilio đã chỉ ra), mà còn, Garbage-Collector là những cỗ máy rất đói bộ nhớ cần nhiều bộ nhớ trống để hoạt động hiệu quả.

Các câu trả lời cho câu hỏi này: StackOverflow: Bộ sưu tập rác cần bao nhiêu bộ nhớ ? vẽ một bức tranh khá nghiệt ngã, nhưng ngay cả khi những người thu gom rác cần bộ nhớ trống chỉ bằng với bộ nhớ được phân bổ, (đó là những gì tôi đã nghe,) điều này vẫn có nghĩa là với Java bạn vẫn sẽ cần rất nhiều bộ nhớ trống cho nó chạy hiệu quả.

Mặt khác, hiện nay chúng ta thường thích mua phần cứng đắt tiền hơn là phải thực hiện các thủ thuật lập trình để tránh vượt quá giới hạn của phần cứng. Trong trường hợp của bạn, các vấn đề về RAM của bạn thường sẽ được giải quyết bằng cách sử dụng máy 64 bit và ném càng nhiều mô-đun RAM vào đó nếu cần. Bạn thấy đấy, chi phí cho phần cứng không ở đâu gần với chi phí thời gian phát triển trong thế giới phát triển ngày nay.

Tôi nghĩ rằng bạn nên nghiêm túc xem xét tùy chọn này và nếu có thể, hãy sử dụng tùy chọn này và với Java thay vì C ++, vì việc phát triển một thứ gì đó trong Java dễ dàng hơn nhiều so với trong C ++ và để tiếp tục duy trì nó sau đó.


Cảm ơn câu trả lời của bạn. Tôi đồng ý với minh họa phần cứng của bạn.
DSign

Nếu bạn không quan tâm đến việc tạm dừng chương trình trong khi bộ sưu tập rác chạy, nhu cầu bộ nhớ sẽ nhỏ hơn nhiều.

1
Tôi không đồng ý với đoạn cuối. Java không nhất thiết phải dễ phát triển hơn C ++. Nó sẽ không dành cho tôi, vì tôi đã thực hiện rất nhiều C ++ và Java tương đối ít trong năm hoặc sáu năm qua. Có thể viết mã có thể duy trì và không thể nhầm lẫn cả trong C ++ và Java.
David Thornley

1
@DavidThornley Tôi đã thực hiện C / C ++ trong hơn 10 năm và Java trong hơn 6 năm. Tôi thấy Java dễ dàng hơn trên tất cả các tính: tạo mẫu, phát triển, mở rộng và duy trì. Nhưng trong mọi trường hợp, đó là những gì ý kiến ​​được thực hiện: khác nhau . C -: =
Mike Nakis

Có ai trong số các bạn đã lập trình cho một dự án dữ liệu lớn, đói xử lý không? Có ý kiến ​​gì không?
DSign

7

Vấn đề là không sử dụng C ++ vì nó là Java và không sử dụng Java vì nó là C ++. Một bộ chứa C ++ thường được triển khai để tránh sự phân mảnh quá mức, giống như kho lưu trữ miễn phí Java.

Nhưng nếu bạn phân bổ cho mình bộ nhớ trực tiếp, bạn cũng có thể làm những điều mà Java không cho phép bạn làm, điều đó có thể dẫn đến sự phân mảnh.

Giải pháp thích hợp (trong C ++) là sử dụng bộ chứa và con trỏ thông minh thông qua các lớp cấp phát quản lý phân bổ bằng các "plexes" cố định (điểm chính, ở đây, là viết một lớp phân bổ tốt). Và đây là một phong cách lập trình không liên quan gì đến Java, vì vậy mọi so sánh đều vô nghĩa.

[EDIT] Đây có thể là một mẫu lỗi thời: Phân bổ cố định


Cảm ơn câu trả lời của bạn Emilio. Tôi nhận thức rõ về tính linh hoạt của C ++ và cảm thấy có xu hướng đồng ý với bạn. Sau đó, một lần nữa, tôi muốn biết một số ví dụ sử dụng thực tế trong đó các kỹ thuật này đã được sử dụng để thành công.
DSign

@dsign: Đăng bài chỉnh sửa, xem liên kết
Emilio Garavaglia

1
Tôi đã sử dụng những kỹ thuật này trước đây. Một ứng dụng hoạt động kém đã khiến bộ cấp phát của nó thay đổi để sử dụng một tập hợp các khối cố định. Vì vậy, khi bạn muốn khối 4 byte, nó xuất phát từ heap chỉ lưu trữ các khối 4 byte. Nếu bạn muốn 5 byte, nó đến từ đống khối 8 byte, v.v. Việc tăng hiệu suất (đối với ứng dụng phân bổ mạnh của chúng tôi) là rất lớn. Bạn có thể không nhận được kết quả tốt, nhưng nó có thể rất hiệu quả. Cũng không có sự phân mảnh nào vì tất cả các khối đều ở trong các khối cố định.
gbjbaanb

2

Ưu điểm của bộ sưu tập rác là nó mô phỏng một cỗ máy có dung lượng bộ nhớ vô hạn. Cơ chế hoặc việc thực hiện sự trừu tượng đó nhằm mục đích hoàn toàn minh bạch đối với bạn với tư cách là người lập trình. Chúng ta đều biết rằng cơ chế đang lấy lại bộ nhớ không còn được sử dụng bởi chương trình, nhưng điều đó không thực sự được đảm bảo. Nếu bạn chạy chương trình trên một máy có nhiều RAM hơn chương trình thực sự sử dụng, thì việc thu gom rác có thể không bao giờ xảy ra. Một lần nữa, không liên quan, bởi vì bạn chỉ có thể viết chương trình mà không cần quan tâm đến cách nó sử dụng bộ nhớ. Trình quản lý bộ nhớ sẽ chỉ phân bổ thêm RAM bất cứ khi nào chương trình yêu cầu và bạn được phép cho rằng các phân bổ đó sẽ luôn thành công. Java là ngôn ngữ được thu gom rác và C ++ thì không. 1

Nhược điểm của bộ sưu tập rác là, giống như tất cả các khái niệm trừu tượng , nó có xu hướng bị rò rỉ. Nó không phải lúc nào cũng hoạt động hoàn hảo mọi lúc, đặc biệt là trong các trường hợp cạnh và bạn có khả năng gặp phải lỗi. Những người đã viết thuật toán thu gom rác (một thuật toán được coi là minh bạch đối với bạn với tư cách là một lập trình viên) được tối ưu hóa cho các trường hợp phổ biến nhất và rắc rối với các trường hợp phổ biến là chúng không bao giờ phổ biến. Nói chung , bạn không thể làm tốt hơn công cụ thu gom rác trong việc quản lý bộ nhớ. Nhưng trong những trường hợp cụ thể (và được cung cấp đủ thời gian, năng lượng và sự hiểu biết), điều đó có thể là có thể. C ++ mang đến cho bạn sự linh hoạt này; Java thì không.

Tất cả những gì đã nói, tôi nghĩ rằng lời khuyên tiêu chuẩn cho việc chọn một ngôn ngữ áp dụng ở đây, có lẽ còn hơn thế nữa trong trường hợp này với những hạn chế. Chọn ngôn ngữ quen thuộc nhất với các nhà phát triển chính cho dự án. Ngoài các lý do rõ ràng (như bạn sẽ có thể phát triển ứng dụng nhanh hơn và hiệu quả hơn), điều này đặc biệtquan trọng trong trường hợp mà bạn mô tả vì lập trình C ++ như bạn đang lập trình Java sẽ dẫn đến các thực tiễn quản lý bộ nhớ không hiệu quả khủng khiếp, do đó bị rò rỉ và gặp sự cố. Tương tự, lập trình trong Java giống như bạn lập trình trong C ++ sẽ không giúp ích gì cho bạn và cuối cùng có thể tạo ra một chương trình ít được tối ưu hóa, do các thuật toán thu gom rác được điều chỉnh và điều chỉnh cho các trường hợp phổ biến nhất .

Các lập trình viên đã từng làm việc trong các ngôn ngữ thu gom rác học cách tin tưởng người thu gom rác hơn là chiến đấu chống lại nó. Nếu bạn đang làm việc trong một ngôn ngữ được thu gom rác, đây là những lập trình viên mà bạn muốn trong dự án của mình. Lập trình viên khôngĐược sử dụng để làm việc trong một ngôn ngữ được thu gom rác vốn đã bị hoài nghi về sự trừu tượng "bộ nhớ vô hạn" như vậy và thường có rất nhiều lý do chính đáng. Tốt như những lập trình viên này có thể là, đây không phải là những người bạn muốn làm việc bằng ngôn ngữ được thu gom rác bởi vì họ sẽ chiến đấu chống lại GC mỗi bước, liên tục đoán nó và thường tạo ra chậm hơn, ít hiệu quả bộ nhớ hơn mã hơn các loại lập trình viên khác. Tốt nhất, họ sẽ chỉ dành nhiều thời gian để phát minh lại bánh xe, khiến bạn tốn rất nhiều tiền và thậm chí nhiều hơn trong chi phí bảo trì dài hạn.

Và sau đó bạn cũng cần tự hỏi liệu nó có thực sự quan trọng không. Có nhiều hơn một gợi ý về sự thật đối với nhận xét về tiếng ngáy của Bo: bộ nhớ bây giờ rất rẻ, hầu như không đáng để vắt tay quá nhiều. Thậm chí nếu bạn cần đồ sộ lượng, số tiền đó là gần như không lớn bây giờ vì họ đã cách đây 10 năm. Các lập trình viên và phát triển ứng dụng là xa đắt hơn chỉ mua gobs RAM và sức mạnh xử lý. Điều đó không có nghĩa là bạn nên tránh kinh tế khi có thể, nhưng điều đó có nghĩa là bạn cũng không nên lãng phí quá nhiều thời gian để làm điều đó.


1 Tất nhiên, giả định này nêu bật một lỗ hổng sâu hơn trong câu hỏi. Hóa ra, "Java hoặc C ++" là một chút cá trích đỏ. Việc triển khai Java tiêu chuẩn cung cấp bộ sưu tập rác và C ++ không theo tiêu chuẩn ngôn ngữ, nhưng hoàn toàn không có lý do gì mà bạn không thể sử dụng trình thu gom rác của bên thứ ba cho C ++. Rất nhiều công ty đã kiếm sống bằng việc bán những thứ này, và một số có lẽ đã kiếm sống miễn phí.

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.