1

C++でメモリサイズを処理するのは良いことなのか悪いことなのか疑問に思います。この質問は私を混乱させました(mode_tが4バイトを使用するのはなぜですか?)。

したがって、大量のデータを格納する必要がない場合は、charを使用するだけではパフォーマンスが低下します。これは、最新のCPUが残りを埋める必要があるためです。したがって、パフォーマンスと計算時間を節約することを考えると、必要なすべての整数型変数に常にsize_tを使用するのが最善でしょうか。大きな配列がある場合、CPUはsize_tを処理するよりも短い値を処理するためにさらに多くの命令を必要としますか?char配列はどうですか?彼らも遅いはずではないでしょうか?

全体として:ベストプラクティスは何ですか?サーバーに多くのメモリがないため、できるだけ多くのメモリを節約したいと思います。一方で、記憶がもっと重要だと思っているので、パフォーマンスを失いたくありません。

これらすべてがどのように機能し、どのような状況で何がより速くなるかについての素晴らしい説明はどこかにありますか?

4

3 に答える 3

3

この質問に対する答えは1つではありません。

  1. 使用する整数型のサイズを小さくすると、局所性が高まり、必要なメモリ帯域幅が減少する可能性があります。だから、それはプラスです。(注:実際のメモリフェッチのコストは低くなりません。)

  2. 使用する整数型のサイズを大きくすると、必要な変換の数を減らすことができます。だから、それはプラスです。

質問は、#1を選択することでどれだけのメモリを節約できるかということです。#2を選択することで、何回のコンバージョンを節約できますか?

客観的な答え

一般に、システム全体のプロファイリング以外の何物も、どちらがより良い代替案であるかを教えてくれます。これは、メモリ不足の軽減に関する質問に答えるのが非常に難しく、システム固有であるためです。プログラムの一部のメモリ使用量を減らすと、通常、プログラムがその部分で費やす時間の割合が増加します。さらに、必要な変換数が多いために、プログラムがシステム全体で使用する時間の割合が増加する場合もあります、またはメモリの負荷が軽減されるため、システムの他の部分が高速になります。したがって、システム全体のプロファイリングが必要です。

当然のことながら、これは本当に苦痛です。

主観的な答え

しかし、私の本能は、この方法で個々のフィールドのメモリ使用量を最小限に抑えることを試みる価値はほとんどないことを教えてくれます。あなたのプログラムは一度に何部のコピーをmode_tメモリに持つと思いますか?せいぜい一握り。したがって、これには経験則があります。

  1. 配列に含まれる場合は、十分な範囲を持つ最小の型を使用してください。たとえば、文字列はchar[]の代わりになりint[]ます。

  2. それ以外の場所に行く場合は、それint以上を使用してください。

だから私の主観的な答えは、あなたの貴重な時間を他の場所で過ごすことです。あなたの時間は貴重であり、フィールドを選択するよりもやるべきことがありintますshort

于 2013-01-02T21:28:31.453 に答える
1

これは時期尚早の最適化のように聞こえます。実際にはまだ発生していないように見えるのに、メモリが不足するのではないかと心配しています。

一般に、CPUのネイティブワードサイズの小さなサブセクションにアクセスすると、より多くのコードが生成されます。したがって、データを8ビットのみに配置することで節約できるスペースは、関心のある特定の8ビットのみを操作するために必要な追加のコードによって50倍以上失われる可能性があります。また、「最適化」によって速度が低下する場所にたどり着く可能性もあります。

struct foo {
    char a1, a2, a3;
    short b1;
};

上記の構造が密集している場合、b1は32ビット境界を越えます。これは、一部のアーキテクチャでは例外をスローし、他のアーキテクチャではデータを取得するために2回のフェッチが必要になります。

か否か。これは、CPUアーキテクチャ、コンピュータのデータアーキテクチャ、コンパイラ、およびプログラムの一般的な使用パターンによって異なります。ここに99%の確率で正しい「ベストプラクティス」が1つあるとは思えません。

スペースが本当に重要な場合は、速度ではなくサイズを最適化するようにコンパイラーに指示し、それが役立つかどうかを確認してください。ただし、低速のバイナリパイプを介してデータを共有している場合を除き、アプリケーションのすべての有効な値を保持するのに十分な大きさである限り、通常、データの大きさを気にする必要はありません。

tl; dr?特定の変数のサイズを小さくするとサーバーのパフォーマンスが大幅に向上することが証明できるまで、size_tを使用してください。

于 2013-01-02T21:26:00.667 に答える
0

あなたの答えはプロセッサに依存します:ターゲットプラットフォームのプロセッサに依存します。データシートを読んで、単一の8ビットフェッチをどのように処理するかを確認してください。

ARM7TDMIプロセッサは、32ビット量をフェッチするのが好きです。それは非常に効率的です。8/32プロセッサとしてラベル付けされており、8ビット量も処理できます。

プロセッサは、配線方法によっては、8ビット量を直接フェッチできる場合があります。それ以外の場合は、最も近い32ビットの整列アドレスを計算し、32ビットを読み取り、未使用のビットを破棄します。これには処理時間がかかります。

したがって、トレードオフはメモリと処理時間です。

  • アプリケーションを圧縮して8ビットを使用すると、処理時間が大幅に増加しますか?
  • あなたの開発スケジュールはこのタスクによっていつでも得られますか?(別名、投資収益率、ROI)
  • クライアントはアプリケーションのサイズについて不満を持っていますか?
  • メモリ使用量を心配する前に、アプリケーションは正しく、エラーがありませんか?
于 2013-01-02T21:26:52.453 に答える