パフォーマンスを重視するクリティカルパスを持つアプリケーションがある場合は常に、メモリの処理方法を気にする必要があります。ほとんどのエンドユーザークライアント側アプリケーションは、主なイベント駆動型であり、ほとんどのイベントはユーザーとの対話から発生し、パフォーマンスの制約が(もしあれば)それほどないため、このカテゴリに分類されません。
ただし、多くのバックエンドソフトウェアは、メモリの処理方法にいくらか焦点を合わせる必要があります。そのソフトウェアの多くは、より多くのクライアント、より多くのトランザクション、より多くのデータソースを処理できるようにスケールアップできるためです。限界を押し広げると、ソフトウェアがユーザーのメモリを分析し、ソフトウェアに合わせたカスタム割り当てスキームを記述し始めることができます。想像できるユースケースを処理するために作成された完全に汎用的なメモリアロケーターに依存する必要はありません。
いくつか例を挙げましょう...私の最初の会社では、歴史的パッケージ、プロセス制御データの収集/保存/アーカイブを担当するソフトウェア(工場、原子力発電所、数千万のセンサーを備えた石油精製所などを考えています)そのデータを保存します)。Historianがより多くのデータを処理するのを妨げるパフォーマンスのボトルネックを分析したときはいつでも、ほとんどの場合、問題はメモリの処理方法にありました。絶対に必要な場合を除いて、malloc / freeが呼び出されないようにするために、長い時間をかけてきました。
現在の仕事では、監視ビデオデジタルレコーダーと分析パッケージに取り組んでいます。30 fpsでは、各チャネルは33ミリ秒ごとにビデオフレームを受信します。私たちが販売しているハードウェアでは、100チャンネルのビデオを簡単に録画できます。これは、クリティカルパス(ネットワークコール=>キャプチャコンポーネント=>レコーダー管理ソフトウェア=>ストレージコンポーネント=>ディスク)に動的メモリ割り当てがないことを確認する別のケースです。バッファの固定サイズのバケットを含み、LIFOを使用して以前に割り当てられたバッファを再利用するカスタムフレームアロケータがあります。600Kbのストレージが必要な場合は、1024Kbのバッファが必要になることがありますが、これはスペースを浪費しますが、各割り当てが非常に短期間である私たちの用途に合わせて特別に調整されているため、バッファが使用されるため、うまく機能します。
私が説明した種類のアプリケーション(大量のデータをAからBに移動し、多数のクライアント要求を処理する)では、ヒープに行き来して、CPUパフォーマンスのボトルネックの主な原因になります。ヒープの断片化を最小限に抑えることは二次的な利点ですが、私が知る限り、ほとんどの最新のOSはすでに低断片化ヒープを実装しています(少なくともWindowsは知っているので、他のOS も同様に期待しています)。個人的には、これらのタイプの環境で12年以上働いていて、ヒープに関連するCPU使用率の問題をかなり頻繁に目にしましたが、実際に断片化されたヒープに実際に苦しんでいるシステムを見たことはありません。