测量C#+ Mono中可用的内存量

时间:2013-09-09 10:30:34

标签: c# windows memory ubuntu mono

我想衡量一下我的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"并且在NextValue次来电时保持返回0。以下是单声道返回的完整类别列表:

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中测量可用内存的方法吗?

[UPDATE]

我设法在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提出解决方案?

2 个答案:

答案 0 :(得分:0)

Thread.Sleep(1000);

放在第一个" NextValue"之后调用(您可以抛出第一个NextValue返回值)并按照您的行跟随它:

float availbleRam = ramCounter.NextValue();

性能计数器需要时间进行测量才能返回结果。

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

答案 1 :(得分:0)

我意识到这是一个古老的问题,但我的回答可能会对某人有所帮助。

您需要找出系统上可用的性能类别和计数器。

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");

根据操作系统的不同,值可能会有所不同,但是您可以通过迭代类别和每个类别的计数器来找到正确的值。