4

コードで使用可能なシステム メモリの量を測定したいと考えていC#ます。私はそれが次のように行われると信じています:

PerformanceCounter ramCounter = new PerformanceCounter(
    "Memory"
    , "Available MBytes"
    , true
);
float availbleRam = ramCounter.NextValue();

ものにはカテゴリがMonoありません。"Memmory"次のように、カテゴリのリストを繰り返し処理しました。

PerformanceCounterCategory[] cats = PerformanceCounterCategory.GetCategories();
string res = "";
foreach (PerformanceCounterCategory c in cats)
{
    res += c.CategoryName + Environment.NewLine;
}
return res;

そして、私が見つけた最も近いカテゴリ"Mono Memory"は、何もなく、呼び出しで"Available MBytes"0を返し続けるものです。NextValueモノが返すカテゴリの完全なリストは次のとおりです。

Processor
Process
Mono Memory
ASP.NET
.NET CLR JIT
.NET CLR Exceptions
.NET CLR Memory
.NET CLR Remoting
.NET CLR Loading
.NET CLR LocksAndThreads
.NET CLR Interop
.NET CLR Security
Mono Threadpool
Network Interface

C#++で使用可能なメモリを測定する方法を知っている人はいますMonoUbuntu?

[アップデート]

私はこれを次のUbuntuように行うことができました(外部プログラムを使用free):

long GetFreeMemorySize()
{
    Regex ram_regex = new Regex(@"[^\s]+\s+\d+\s+(\d+)$");
    ProcessStartInfo ram_psi = new ProcessStartInfo("free");
    ram_psi.RedirectStandardOutput = true;
    ram_psi.RedirectStandardError = true;
    ram_psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    ram_psi.UseShellExecute = false;
    System.Diagnostics.Process free = System.Diagnostics.Process.Start(ram_psi);
    using (System.IO.StreamReader myOutput = free.StandardOutput)
    {
        string output = myOutput.ReadToEnd();
        string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        lines[2] = lines[2].Trim();
        Match match = ram_regex.Match(lines[2]);
        if (match.Success)
        {
            try
            {
                return Convert.ToInt64(match.Groups[1].Value);
            }
            catch (Exception)
            {
                return 0L;
            }
        }
        else
        {
            return 0L;
        }
    }
}

しかし、このソリューションの問題はMono、システム内で実行された場合にのみ機能することですLinuxMono誰かが+の解決策を思い付くことができるかどうか知りたいWindowsですか?

4

2 に答える 2

1

これは古い質問だと思いますが、私の答えは誰かを助けるかもしれません。

システムで使用できるパフォーマンス カテゴリとカウンタを確認する必要があります。

foreach (var cat in PerformanceCounterCategory.GetCategories())
{
    Console.WriteLine(cat.CategoryName + ":");
    foreach (var co in cat.GetCounters())
    {
        Console.WriteLine(co.CounterName);
    }                
}

次に、対応する値を使用してパフォーマンスを測定する必要があります。

Windows の場合、次のようになります。

var memory = new PerformanceCounter("Memory", "Available MBytes");

Linux の場合 (Yogurt 0.2.3 でテスト済み):

var memory = new PerformanceCounter("Mono Memory", "Available Physical Memory");

値はオペレーティング システムによって異なる場合がありますが、カテゴリと各カテゴリのカウンターを繰り返すことで正しい値を見つけることができます。

于 2020-09-21T07:50:37.750 に答える