ホームページ  >  記事  >  バックエンド開発  >  C++ パフォーマンス分析 (3): ヒープ オブジェクトとスタック (自動) オブジェクト、heapstack_PHP チュートリアル

C++ パフォーマンス分析 (3): ヒープ オブジェクトとスタック (自動) オブジェクト、heapstack_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:20:091259ブラウズ

C++ パフォーマンス分析 (3): ヒープ オブジェクト vs. スタック (自動) オブジェクト、ヒープスタック

一般に、パフォーマンスの向上は 90 ~ 10 の法則であると考えられています。つまり、コードの 10% が 90 の責任を負っています。パフォーマンスの問題の割合。大規模なソフトウェア プロジェクトを行ったプログラマは、通常、この概念を知っています。

ただし、ソフトウェア エンジニアにとって、10% に属するか 90% に属するかに関係なく、一部のパフォーマンスの問題は改善する必要があります。ここでは、問題の 1 つである、ヒープを使用するかスタックを使用するかについて説明します。

Java、C#、および JavaScript のプログラマーは、通常、作成したオブジェクトがヒープにあるかスタックにあるかを気にしません。これらの言語では、オブジェクトはヒープ内でのみ「存在」できるからです。プログラマーにとって、これは間違いなくはるかに簡単です。ただし、C++ プログラマーの場合は、オブジェクトを作成する場所を 3 つ選択できます:

  • プログラムのデータセクション
  • 仕事の積み重ね
  • ヒープ

オブジェクトはどこに住めばよいですか?この問題は、アプリケーションのプロパティによって決定する必要があります。たとえば、動的に生成されたグローバル変数の場合、ヒープ内に存在する以外に方法がない場合があります。

ただし、複雑なデータのキャリアとして一時オブジェクトを選択するなどの選択肢があれば、答えは明らかです。たとえば、次の単純な例はスタックの方が好ましいです。

A e // ヒープ vs スタック テスト

double HeapVsStack(bool ヒープ、int ループ、int &result) {

if (ヒープ)

{

Clock_t begin = Clock();

for(int i = 0; i

{

intPair *p = new intPair(1,2);

}

Clock_t end = Clock(); return double(end - begin) / CLOCKS_PER_SEC; }

その他 { Clock_t begin = Clock();

for(int i = 0; i

{

}

Clock_t end = Clock();

return double(end - begin) / CLOCKS_PER_SEC;

}

}

プログラムの太字で拡大した部分が計測対象の「アプリケーションロジック」で、上記のヒープにintPairが作成され、使用後に削除されます。以下では、同じ auto 変数をスタックに定義します。使用後は気にする必要はありません。

このプログラムに対して次の簡単なテスト呼び出しを行います:

int 結果 = 0;

printf("ヒープ時間: %f n", HeapVsStack(true, 100000, result));

printf("スタック時間: %f n", HeapVsStack(false, 100000, result));

時間の違いが大きすぎるため、100,000 回呼び出す必要がありました。スタックのユースケースでは 10,000 回未満で 0ms が表示されました。

テスト結果は、ヒープに 300 ミリ秒、スタックに 5 ミリ秒かかり、その差は 60 倍であることを示しています。

結論:

1) アプリケーションロジックが許可する場合は、スタックベースの自動変数を使用し、ヒープ変数は決して使用しないでください。

2) 大量のヒープを使用する必要がある場合は、独自の単純なヒープ マネージャーとして std::vector を使用することをお勧めします。アドホック オブジェクトを作成するためにヒープを直接かつ広範囲に使用することは避けてください。

3) 一時的な計算に使用される一部のクラスは、ヒープ内での生成が禁止されていると考えられます。http://stackoverflow.com/questions/1941517/explicitly-disallow-heap-allocation-in-c の記事を参照してください。

2014-8-23

Seattle

ヒープ メモリとスタック メモリの違いは何ですか?

引用: www.blogjava.net/...9.aspx
今朝、バッファ オーバーフローの問題を扱った記事を読んでいましたが、C のスタックとヒープに関しては、何か理解できませんでした。そこでBaiduで検索したところ、フォーラムの説明はすべて間違っていることがわかりました。Googleで検索したところ、海外の大学の講義ノートに多くの説明があることがわかりました。以下に3つの簡単な抜粋を示します。 C の場合、2 番目は Java に関するもの、3 番目は OS の観点からのものです。

スタックとヒープの割り当て
実行中のプログラムに対してコンピューターのメモリはどのように構成されますか? プログラムがメモリにロードされると、テキスト セグメント、スタック セグメント、ヒープ セグメントというセグメントと呼ばれるメモリの 3 つの領域に編成されます。テキスト セグメント (コード セグメントとも呼ばれる) は、プログラム自体のコンパイル済みコードが存在する場所であり、プログラムを構成するすべての関数 (ユーザー定義およびユーザー定義の両方) が含まれます。 system.

システム メモリの残りの 2 つの領域は、コンパイラによってデータ ストレージ用にメモリが割り当てられる場所です。スタックは、関数内の自動変数にメモリが割り当てられる場所です。スタックは、Last In First Out (LIFO) ストレージ デバイスです。新しいストレージは、スタックのトップと呼ばれる 1 つの「端」でのみ割り当てられ、割り当てが解除されます。これは、プログラムが関数 main() で実行を開始するときの図 14.13 に示されています。図 14.13(a) に示すように、main() 内で宣言されたすべての変数に対してスペースがスタック上に割り当てられます。main() が関数 func1() を呼び出すと、追加のストレージが func1() の変数に割り当てられます。スタックの一番上に...テキストの残り>>




ヒープメモリとスタックメモリの違いは何ですか?

ヒープは malloc や new など動的に割り当てられますが、スタックは静的です。

そして申請された保管スペースの場所が異なります。



http://www.bkjia.com/PHPjc/868462.html
www.bkjia.com

tru​​e

技術記事 C++ パフォーマンス分析 (3): ヒープ オブジェクトとスタック (自動) オブジェクト ヒープスタックでは一般に、パフォーマンスの向上は 90 ~ 10 の法則、つまり、コードの 10% がパフォーマンスの問題の 90% の原因であると考えられています。やった...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。