質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

Q&A

解決済

1回答

5031閲覧

ヒープ使用量測定

ai_2013_dev

総合スコア338

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

0グッド

0クリップ

投稿2016/01/15 15:38

編集2016/01/22 15:30

ユーザから提供されているライブラリを使用します。
ユーザから各ライブラリの各メソッドの使用している
ヒープを測定して提出するように指示を受けました。
ユーザ曰くメモリ設計に必要とのこと。

そこで質問があります。
ライブラリの各メソッドのヒープ使用量を正確に測定する方法を教えてください。

ライブラリのソースコードは、見ることはできません。
プログラムは、C# .NET3.5で作成されています。

以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/15 16:37

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
tanat

2016/01/15 19:35

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
izkn

2016/01/15 21:56

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答1

0

ベストアンサー

正確には出せないと思います。

.NETではCLRがメモリを管理するので、その時々によって余分に割当てられそのなかから使用され、その後必要に応じてCLRがメモリ領域を開放します。そのため、正確に計測することがむづかしいのです。

また、メソッドて使用しているオブジェクトのサイズですが、これもどこまでを対象のメソッドのものと考えるかは難しいです。

System.GCクラスを使うと現在使用しているメモリの情報を取得できるので、うまく組み合わせれば必要なデータに近いものが出せるかもしれません。

質問の目的・背景とあなたの技術力に関する情報がないので、これ以上の回答が難しいです。

投稿2016/01/15 17:59

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai_2013_dev

2016/01/22 15:28

ご回答ありがとうございます。 正確に出せないことはわかりました。 質問の目的や背景がわからないことなので 追記させて頂きます。
iwamoto_takaaki

2016/01/23 11:23

ユーザーの方もガベージコレクションについてはあまり知識がないようですね。 どのように説明していいかわからないところがありますが、ちょっと試してみました。 (やってみたくなった。) https://paiza.io/projects/e/nvdlg-jyGsgkPB-esBzkaw 計3種類、20回ずつ適当なサイズのオブジェクトを受け取る毎に使用メモリをカウントしています。 1種類目はメソッド呼び出した結果を保持するケースで、GCは起こりませんので、使用メモリは直線的に伸びていきます。その後、GCを実行してからのメモリの計測しても初期値まで戻りませんでした。参照カウンタのみでは解放されないのかもしれません。 2種類目は毎回、GCをしてみました。メモリ使用量は変わりませんでした。つまり、メソッド呼び出し中にGCが行われた場合、使用メモリの量は計測できないことになります。 3種類目はGCはメモリを開放してよいタイミングでもしばらくGCが起動しないことを示しています。 このように、論理的なヒープとある程度離れているため、測定が難しいことが分かります。
ai_2013_dev

2016/01/24 09:59

ユーザにメモリ使用量を報告する都合、 プログラムを作成し、確認してみました。 測定対象のメソッドの呼び出し前と後の差を 求めて、使用量を求めるプログラムを作成しました。 ・コーディングイメージ long startMem = GC.GetTotalMemory(true); class.Start(); // ターゲットメソッド long endMem = GC.GetTotalMemory(false); System.Console.WriteLine("使用量:" + (endMem - startMem)); 一応、正確な使用量を求めることが現実的に無理なことと ばらつきがあり、平均化していることも報告しました。
iwamoto_takaaki

2016/01/24 11:06

ユーザーに納得してもらえるといいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問