GNU/Linux >> Linux の 問題 >  >> Linux

LinuxにプロファイリングツールGprofをインストールして使用する方法

テストが不可欠であり、ソフトウェア開発プロセスの最も重要な側面の1つであることは間違いありません。また、テストとは、コードのバグをテストすることだけを意味するのではありません。もちろん、ソフトウェアにバグが発生することを誰も望まないため、バグの検出は重要です。最近では、コードのパフォーマンスも同様に重要です。

最後のビットに分解すると、パフォーマンステストは、特定のコード(関数など)が消費している時間を効果的にテストします。通常の場合のように、機能または機能のグループは、ソフトウェアの多くの機能の1つに対応する場合があります。したがって、パフォーマンステストを通じて、コード内のこれらの関数のパフォーマンスを向上させることができれば、ソフトウェアの全体的なパフォーマンスが向上します。

C、Pascal、またはFortran77プログラミング言語でコードを記述し、開発プラットフォームとしてLinuxを使用しているプログラマーの場合、コードのパフォーマンスを確認できる強力なツールが存在することを知って喜ぶでしょう。問題のツールはGprofです。このチュートリアルでは、このツールをダウンロード、インストール、および使用する方法の詳細について説明します。

先に進む前に、このチュートリアルで説明されているすべての例と手順はUbuntu 14.04LTSでテストされており、使用されているGprofのバージョンは2.24であることに注意してください。

Gprofとは何ですか?

では、Gprofとは正確には何ですか?ツールの公式ドキュメントによると、C、Pascal、またはFortran77プログラムの実行プロファイルをユーザーに提供します。 Gprofが基本的に行うことは、各ルーチンまたは関数で費やされた時間を計算することです。 「次に、これらの時間はコールグラフの端に沿って伝播されます。サイクルが検出され、サイクルへの呼び出しが行われて、サイクルの時間が共有されます。」

この時点でこれらすべてが少し混乱しているように聞こえる場合(特に引用符で囲まれている部分)、例を通して物事を明確にするので、心配しないでください。だから、読んでください。

Gprofをダウンロードしてインストールする

まず、ツールがシステムにすでにインストールされているかどうかを確認します。これを行うには、ターミナルで次のコマンドを実行するだけです。

$ gprof

次のようなエラーが発生した場合:

$ a.out: No such file or directory

その場合、これはツールがすでにインストールされていることを意味します。それ以外の場合は、次のコマンドを使用してインストールできます:

$ apt-get install binutils

Gprofの使用法

言うまでもなく、Gprofのようなツールを理解するための最良の方法は、実際の例を使用することです。そこで、Gprofを介してプロファイリングするC言語プログラムから始めます。プログラムは次のとおりです。

//test_gprof.c

#include<stdio.h>

void func4(void)
{
    printf("\n Inside func4() \n");
    for(int count=0;count<=0XFFFF;count++);
}

void func3(void)
{
    printf("\n Inside func3() \n");
    for(int count=0;count<=0XFFFFFFF;count++);
}

void func2(void)
{
    printf("\n Inside func2() \n");

    for(int count=0;count<=0XFFF;count++);

    func3();
}

void func1(void)
{
    printf("\n Inside func1() \n");
    for(int count=0;count<=0XFFFFFF;count++);

    func2();
}

int main(void)
{
    printf("\n main() starts...\n");
    for(int count=0;count<=0XFFFFF;count++);

    func1();
    func4();
    printf("\n main() ends...\n");

    return 0;
}

上記のコード( test_gprof.c )に注意してください )は、Gprofを説明するために特別に作成されています。実際のプロジェクトから取得したものではありません。

次に進むと、次のステップはgccを使用してこのコードをコンパイルすることです。理想的には、次のコマンドを使用して上記のコードをコンパイルすることに注意してください。

$ gcc -Wall -std=c99 test_gprof.c -o test_gprof

ただし、Gprofを使用してコードをプロファイリングする必要があるため、 -pgを使用する必要があります。 gccコンパイラによって提供されるコマンドラインオプション。したがって、コマンドは次のようになります。

$ gcc -Wall -std=c99 -pg test_gprof.c -o test_gprof

gccのmanページを見ると、 -pgについて次のようになっています。 オプション:

「分析プログラムgprofに適したプロファイル情報を書き込むための追加のコードを生成します。データが必要なソースファイルをコンパイルするときにこのオプションを使用する必要があります。また、リンクするときにもこのオプションを使用する必要があります。」

ここで、上記のコマンドに戻ると、正常に実行された後、 test_gprofという名前のバイナリが生成されます。 出力で。次のステップは、その実行可能ファイルを起動することです。私の場合、バイナリを起動した方法は次のとおりです。

$ ./test_gprof

コマンドを実行すると、 gmon.outという名前のファイルが表示されます。 現在の作業ディレクトリに生成されます。

$ ls gmon*
gmon.out


このファイルには、人間が読める形式のプロファイリングデータを生成するためにGprofツールが必要とするすべての情報が含まれています。したがって、Gprofツールを次のように使用します。

$ gprof test_gprof gmon.out > profile-data.txt

基本的に、このコマンドの一般的な構文は次のとおりです。

$ gprof [executable-name] gmon.out > [name-of-file-that-will-contain-profiling-data]

さて、情報を見る前に、 profile-data.txt ファイルに含まれているのは、Gprofが生成する人間が読める形式の出力が、フラットプロファイルとコールグラフの2つの部分に分かれていることです。 Gprofのmanページには、次の2つのセクションの情報が記載されています。

「フラットプロファイルは、プログラムが各関数で費やした時間と、その関数が呼び出された回数を示します。どの関数がほとんどのサイクルを消費するかを知りたい場合は、ここに簡潔に記載されています。」

「コールグラフには、関数ごとに、呼び出された関数、呼び出された他の関数、および回数が表示されます。また、各関数のサブルーチンに費やされた時間の見積もりもあります。これは、時間がかかる関数呼び出しを排除しようとする可能性のある場所。」

この情報があれば、プロファイリング出力ファイル( profile-data.txt )に存在するデータをよりよく理解できるようになります。 私の場合)。私の場合のフラットプロファイルは次のとおりです。

Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
96.43 0.81 0.81 1 810.00 810.00 func3
3.57 0.84 0.03 1 30.00 840.00 func1
0.00 0.84 0.00 1 0.00 810.00 func2
0.00 0.84 0.00 1 0.00 0.00 func4

そして、各フィールドの意味は次のとおりです。

次に、私の場合のコールグラフは次のとおりです。

Call graph (explanation follows)


granularity: each sample hit covers 4 byte(s) for 1.19% of 0.84 seconds

index % time self children called name
0.03 0.81 1/1 main [2]
[1] 100.0 0.03 0.81 1 func1 [1]
0.00 0.81 1/1 func2 [3]
-----------------------------------------------
<spontaneous>
[2] 100.0 0.00 0.84 main [2]
0.03 0.81 1/1 func1 [1]
0.00 0.00 1/1 func4 [5]
-----------------------------------------------
0.00 0.81 1/1 func1 [1]
[3] 96.4 0.00 0.81 1 func2 [3]
0.81 0.00 1/1 func3 [4]
-----------------------------------------------
0.81 0.00 1/1 func2 [3]
[4] 96.4 0.81 0.00 1 func3 [4]
-----------------------------------------------
0.00 0.00 1/1 main [2]
[5] 0.0 0.00 0.00 1 func4 [5]

次のスクリーンショットは、コールグラフに含まれる情報を説明しています。

上記のスクリーンショットのソースについて疑問がある場合は、フラットプロファイルやコールグラフなどのプロファイリング情報を含む出力ファイルに、このすべての情報が含まれていることをお知らせします。この情報を出力から省略したい場合は、 -bを使用できます。 Gprofが提供するオプション。

結論

言うまでもなく、Gprofは多くの機能を提供しているため、ここでは表面をかじったところです(manページをご覧ください)。ただし、ここで取り上げた内容は、開始するのに十分なはずです。すでにGprofを使用していて、ツールに関連する何かをここにいる全員と共有したい場合は、下のコメントにドロップしてください。


Linux
  1. LinuxでFlatpakをインストールして使用する方法

  2. LinuxでTracerouteをインストールして使用する方法

  3. MoshコマンドラインツールLinuxをインストールして使用する方法

  1. KaliLinuxにtelnetをインストールして使用する方法

  2. Linux Screenをインストールして使用する方法は?

  3. GPROF チュートリアル – Linux GNU GCC プロファイリング ツールの使用方法

  1. LinuxにSSHFSをインストールして使用する方法

  2. LinuxでSlackをインストールして使用する方法

  3. LinuxにPuTTYをインストールして使用する方法