Bởi vì có một sự khác biệt rất lớn giữa tối ưu hóa hiệu suất và tắt hoàn toàn an toàn
Bằng cách giảm số lượng GC, khung của họ phản ứng nhanh hơn và có thể chạy (có lẽ) nhanh hơn. Bây giờ, tối ưu hóa cho trình thu gom rác không có nghĩa là họ không bao giờ thực hiện việc thu gom rác. Nó chỉ có nghĩa là họ làm điều đó ít thường xuyên hơn, và khi họ làm điều đó, nó chạy rất nhanh. Những loại tối ưu hóa bao gồm:
- Giảm thiểu số lượng vật thể di chuyển đến một không gian sống sót (nghĩa là đã sống sót ít nhất một bộ sưu tập rác) bằng cách sử dụng các vật thể vứt bỏ nhỏ. Đối tượng di chuyển đến không gian sống sót khó thu thập hơn và bộ sưu tập rác ở đây đôi khi ngụ ý đóng băng toàn bộ JVM.
- Đừng phân bổ quá nhiều đối tượng để bắt đầu. Điều này có thể gây tác dụng ngược nếu bạn không cẩn thận, vì các đối tượng thế hệ trẻ có giá siêu rẻ để phân bổ và thu thập.
- Đảm bảo rằng đối tượng mới trỏ đến đối tượng cũ (chứ không phải ngược lại) để đối tượng trẻ dễ thu thập, vì không có tham chiếu nào đến chúng sẽ khiến chúng bị giữ
Khi bạn điều chỉnh hiệu suất, bạn thường điều chỉnh một số "điểm nóng" rất cụ thể trong khi bỏ qua mã không chạy thường xuyên. Nếu bạn làm điều đó trong Java, bạn có thể để trình thu gom rác vẫn xử lý các góc tối đó (vì nó sẽ không tạo ra nhiều khác biệt) trong khi tối ưu hóa rất cẩn thận cho khu vực chạy trong một vòng lặp chặt chẽ. Vì vậy, bạn có thể chọn nơi bạn tối ưu hóa và nơi bạn không, và do đó bạn có thể tập trung nỗ lực của mình vào nơi quan trọng.
Bây giờ, nếu bạn tắt bộ sưu tập rác hoàn toàn, thì bạn không thể chọn. Bạn phải vứt bỏ thủ công mọi đối tượng, bao giờ hết. Phương pháp đó được gọi nhiều nhất một lần mỗi ngày? Trong Java, bạn có thể để nó như vậy, vì tác động hiệu năng của nó là không đáng kể (có thể ổn khi để cho một GC đầy đủ xảy ra mỗi tháng). Trong C ++, bạn vẫn đang rò rỉ tài nguyên, vì vậy bạn phải cẩn thận ngay cả phương thức tối nghĩa đó. Vì vậy, bạn phải trả giá cho việc quản lý tài nguyên trong mọi phần, một phần của ứng dụng của bạn, trong khi ở Java, bạn có thể tập trung.
Nhưng nó trở nên tồi tệ hơn.
Điều gì nếu bạn có một lỗi, giả sử trong một góc tối của ứng dụng của bạn chỉ được truy cập vào thứ Hai vào một ngày trăng tròn? Java có đảm bảo an toàn mạnh mẽ. Có rất ít hoặc không có "hành vi không xác định". Nếu bạn sử dụng sai, một ngoại lệ sẽ bị ném, chương trình của bạn dừng lại và không xảy ra hỏng dữ liệu. Vì vậy, bạn khá chắc chắn rằng không có gì sai có thể xảy ra mà bạn không nhận ra.
Nhưng trong một cái gì đó như D, bạn có thể có quyền truy cập con trỏ xấu hoặc tràn bộ đệm và bạn có thể làm hỏng bộ nhớ của mình, nhưng chương trình của bạn sẽ không biết (bạn đã tắt an toàn, nhớ không?) Và sẽ tiếp tục chạy không đúng dữ liệu, và làm một số điều khá khó chịu và làm hỏng dữ liệu của bạn, và bạn không biết, và khi càng nhiều tham nhũng xảy ra, dữ liệu của bạn càng ngày càng sai, và sau đó đột nhiên nó bị hỏng, và đó là một ứng dụng quan trọng trong cuộc sống, và Một số lỗi đã xảy ra trong tính toán của một tên lửa, và do đó nó không hoạt động, và tên lửa phát nổ, và ai đó chết, và công ty của bạn ở trên trang nhất của mỗi tờ báo và ông chủ của bạn chỉ tay bạn nói rằng "Bạn là kỹ sư gợi ý chúng tôi sử dụng D để tối ưu hóa hiệu suất, tại sao bạn không nghĩ đến sự an toàn?"Và đó là lỗi của bạn. Bạn đã giết những người đó bằng nỗ lực ngu ngốc của mình trong hiệu suất.
OK, ok, hầu hết thời gian nó ít kịch tính hơn thế. Nhưng ngay cả một ứng dụng quan trọng trong kinh doanh hoặc chỉ là một ứng dụng GPS hoặc giả sử, một trang web chăm sóc sức khỏe của chính phủ có thể mang lại một số hậu quả khá tiêu cực nếu bạn gặp lỗi. Sử dụng một ngôn ngữ ngăn chặn chúng hoàn toàn hoặc thất bại nhanh khi chúng xảy ra thường là một ý tưởng rất tốt.
Có một chi phí để tắt một sự an toàn. Về bản địa không phải lúc nào cũng có ý nghĩa. Đôi khi nó đơn giản và an toàn hơn nhiều khi chỉ cần tối ưu hóa một chút ngôn ngữ an toàn để sử dụng tất cả ngôn ngữ mà bạn có thể tự bắn vào chân mình. Tính chính xác và an toàn trong rất nhiều trường hợp là một vài nano giây mà bạn đã loại bỏ bằng cách loại bỏ hoàn toàn GC. Disruptor có thể được sử dụng trong những tình huống đó, vì vậy tôi nghĩ LMAX-Exchange đã thực hiện cuộc gọi đúng.
Nhưng những gì về D nói riêng? Bạn có một GC nếu bạn muốn cho các góc tối và tập hợp con SafeD (mà tôi không biết trước khi chỉnh sửa) xóa hành vi không xác định (nếu bạn nhớ sử dụng nó!).
Vâng, trong trường hợp đó là một câu hỏi đơn giản về sự trưởng thành. Hệ sinh thái Java có đầy đủ các công cụ được viết tốt và các thư viện trưởng thành (tốt hơn để phát triển). Nhiều nhà phát triển biết Java hơn D (tốt hơn để bảo trì). Tìm kiếm một ngôn ngữ mới và không phổ biến cho một thứ quan trọng như ứng dụng tài chính sẽ không phải là một ý tưởng hay. Với ngôn ngữ ít được biết đến, nếu bạn gặp vấn đề, ít người có thể giúp bạn và các thư viện bạn tìm thấy có xu hướng có nhiều lỗi hơn do chúng tiếp xúc với ít người hơn.
Vì vậy, điểm cuối cùng của tôi vẫn là: nếu bạn muốn tránh các vấn đề với hậu quả thảm khốc, hãy kiên trì với các lựa chọn an toàn. Tại thời điểm này trong cuộc đời của D, khách hàng của nó là những người khởi nghiệp nhỏ sẵn sàng chấp nhận rủi ro điên rồ. Nếu một vấn đề có thể tốn hàng triệu đô la, tốt hơn hết bạn nên tiếp tục theo đường cong chuông đổi mới .