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#++中的可用Mono内存Ubuntu

[更新]

我设法这样做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只有在Linux系统内运行时才能使用。我想知道是否有人可以提出Mono+的解决方案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 回答
0
Thread.Sleep(1000);

把它放在你的第一个“NextValue”调用之后(你可以扔掉第一个 NextValue 返回值),然后在你的行后面跟着它:

float availbleRam = ramCounter.NextValue();

性能计数器需要时间来测量,然后才能返回结果。

确认这适用于带有 .net 4.5 的 Windows,不确定带有 Mono 的 Linux。

于 2015-02-12T19:52:46.920 回答