Bất cứ khi nào bạn có một ứng dụng có đường dẫn quan trọng về hiệu năng, bạn nên quan tâm đến cách bạn đối xử với bộ nhớ. Hầu hết các ứng dụng phía máy khách của người dùng cuối không thuộc loại này vì chúng là các sự kiện chính và hầu hết các sự kiện đến từ các tương tác với người dùng và điều đó không có nhiều ràng buộc về hiệu năng (nếu có).
Tuy nhiên, rất nhiều phần mềm back-end nên tập trung vào cách xử lý bộ nhớ vì rất nhiều phần mềm đó có thể mở rộng để xử lý số lượng khách hàng cao hơn, số lượng giao dịch lớn hơn, nhiều nguồn dữ liệu hơn .... Khi bạn bắt đầu đẩy các giới hạn, bạn có thể bắt đầu phân tích cách bộ nhớ người dùng phần mềm của bạn và viết các sơ đồ phân bổ tùy chỉnh phù hợp với phần mềm của bạn thay vì dựa vào bộ cấp phát bộ nhớ hoàn toàn chung được viết để xử lý mọi trường hợp sử dụng có thể tưởng tượng được.
Để cho bạn một vài ví dụ ... trong công ty đầu tiên của tôi, tôi đã làm việc với gói Lịch sử, phần mềm chịu trách nhiệm thu thập / lưu trữ / lưu trữ dữ liệu kiểm soát quá trình (nghĩ về một nhà máy, nhà máy điện hạt nhân hoặc nhà máy lọc dầu với 10 triệu cảm biến, chúng tôi sẽ lưu trữ dữ liệu đó). Bất cứ khi nào chúng tôi phân tích bất kỳ tắc nghẽn hiệu suất nào đã ngăn Nhà sử học xử lý nhiều dữ liệu hơn, phần lớn thời gian là vấn đề nằm ở cách xử lý bộ nhớ. Chúng tôi đã trải qua thời gian dài để đảm bảo malloc / miễn phí không được gọi trừ khi chúng thực sự cần thiết.
Trong công việc hiện tại của tôi, tôi làm việc trên gói ghi âm và phân tích kỹ thuật số video giám sát. Với tốc độ 30 khung hình / giây, mỗi kênh nhận được một khung hình video cứ sau 33 mili giây. Trên phần cứng chúng tôi bán, chúng tôi có thể dễ dàng ghi lại 100 kênh video. Vì vậy, đó là một trường hợp khác để đảm bảo rằng trong đường dẫn quan trọng (cuộc gọi mạng => thành phần chụp => phần mềm quản lý đầu ghi => thành phần lưu trữ => đĩa) không có phân bổ bộ nhớ động. Chúng tôi có một bộ cấp phát khung tùy chỉnh, chứa các bộ đệm có kích thước cố định và sử dụng LIFO để sử dụng lại các bộ đệm được phân bổ trước đó. Nếu bạn cần 600Kb dung lượng lưu trữ, bạn có thể kết thúc với bộ đệm 1024Kb, gây lãng phí dung lượng, nhưng vì nó được thiết kế riêng cho mục đích sử dụng của chúng tôi khi mỗi phân bổ rất ngắn, nên nó hoạt động rất tốt vì bộ đệm được sử dụng,
Trong loại ứng dụng tôi đã mô tả (di chuyển nhiều dữ liệu từ A sang B và xử lý số lượng lớn yêu cầu của khách hàng) đi đến đống và trở lại là một nguồn chính của các tắc nghẽn hiệu suất CPU. Giữ phân mảnh heap ở mức tối thiểu là lợi ích thứ cấp, tuy nhiên theo như tôi có thể nói với hầu hết các hệ điều hành hiện đại đã thực hiện các đống phân mảnh thấp (tối thiểu tôi biết Windows cũng vậy, và tôi cũng hy vọng những người khác cũng làm như vậy). Cá nhân, trong hơn 12 năm làm việc trong các loại môi trường này, tôi đã thấy các vấn đề sử dụng CPU liên quan đến heap khá thường xuyên, trong khi chưa bao giờ tôi thấy một hệ thống thực sự bị đống phân mảnh.