7

C アプリケーションのメモリ プロファイリングを行う必要があります。

フットプリントサイズとRAMサイズを含める必要があります...

たとえば、私のアプリケーションが以下のような場合..

#include <stdio.h>

int global = 10; /* initialized global variable */

int test_code(void)
{
    static int i = 100; /* Initialized static variable*/
    return 0;
}

出力:

[putta@linux]$ gcc memory-layout.c -c memory-layout 

[putta@linux]$ ls -ltrh  memory-layout.o
760 Nov  9 18:26 memory-layout

[putta@linux]$ size memory-layout.o
   text    data     bss     dec     hex filename
     67       8       0      75      4b memory-layout.o

したがって、フットプリントのプロファイリングで考慮すべきメモリと、プログラムがロードされるときの RAM ..

以下のプロファイリングは正しいですか?フットプリント メモリ = 760 (フラッシュまたはハードディスクを搭載) RAM = 67+8+0 = 75 バイト

専門家からの提案が必要

4

2 に答える 2

5

オブジェクトのメモリサイズを見つける

ディスク上のプログラムのサイズと RAM 内のテキストとデータのサイズを知りたい場合は、Linux/Unix で size コマンドを使用できます。

$> size /bin/cat
text       data     bss     dec     hex filename
43422      1720    2472   47614    b9fe /bin/cat

size の出力は、オブジェクト ファイルのさまざまな部分のメモリ サイズです。

  • text : (コード セグメント) 実行可能な命令
  • data : (データ セグメント) 初期化されたグローバル変数
  • bss : (シンボルで始まるブロック) 静的に割り当てられた変数

最後の 2 つの列dechexは、それぞれ他の 3 つの列 (全体のサイズ) の合計を 10 進数と 16 進数で表したものです。

求めているサイズは、lsの出力(ディスク上のサイズを示します) に、RAM 上のサイズを示すsizeコマンドの出力のdec部分を加えたものです。

これらの投稿も参照してください: http://www.cyberciti.biz/faq/linux-find-size-of-text-data-segment-bss-uninitialized-data/バイナリ実行可能ファイルのメモリフットプリントを知る方法

メモリフットプリントを見つける

ソフトウェア アプリケーションを参照する場合、フットプリントは、実行中のプロセスによって消費されるメモリのサイズを示します (実行時のメモリ要件)。

プロセスの実行中にメモリフットプリントを確認する必要があることは明らかです。唯一の現実的な選択肢はvalgrindのようなツールを使用することだと思います (そして他の投稿で確認されています) 。

valgrind を使用してアプリケーションをプロファイリングする

Massifツールを使用してメモリをプロファイリングできます。Massifヒーププロファイラーですが、スタックのサイズも測定できます。

valgrind --tool=massif --stacks=はい

これにより、ヒープスタックの両方のメモリ使用量がわかります。その後、情報はファイル massif.out.???? に保存されます。あなたが読むことができる

ms_print massif.out.?????

ファイルの最初の出力は、実行時のメモリ使用量の優れたグラフです。

--------------------------------------------------------------------------------
Command:            ./myprog -f d5.ini
Massif arguments:   --stacks=yes
ms_print arguments: massif.out.24377
--------------------------------------------------------------------------------


    MB
5.292^                                                    ##                  
     |    @                 :           :  @@   :      :  # ::::   :  :       
     |    @:::: ::    :   :@:@@::::::::::::@ :::::::::::::# ::::@::::@::::::::
     |    @:: ::: :::::::::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |    @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |   @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     |   @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | ::@@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
     | : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
   0 +----------------------------------------------------------------------->Gi
     0                                                                   1.030

詳細は、異なるテーブル内のファイルに保存されます。出力を完全に理解するには、Valgrind のマニュアルページを参照してください。

子をトレースするオプションは次のとおりです。--trace-children=yes

興味深いことに、「プロセスの実際のメモリ使用量」はないようです: https://unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process

于 2015-11-09T14:18:24.817 に答える
2

このプログラムは未定義です:main関数はありません。

この場合、コンパイラは何もコンパイルしない権利を留保するため、フットプリントとメモリ サイズはゼロになります。

于 2015-11-09T13:07:55.487 に答える