调用GC.GetTotalMemory(false)的开销

时间:2015-10-30 18:36:33

标签: c# .net garbage-collection

在我工作的公司中,我们有一堆Web应用程序,我们在网站的页脚中显示一些对开发人员有用的信息(例如汇编版本)。

性能明智(我不关心它的UX方面),通过调用GC.GetTotalMemory(false)显示内存使用情况是不是一个坏主意?我是否应该担心每次请求都执行此调用?

1 个答案:

答案 0 :(得分:1)

当我看到你的问题时我很好奇,因为它不是常规的东西,并决定尝试一下。

创建了一个简单的网站,在default.aspx中填充了近1 GB的小对象(1000万字节数组,每个64字节)到堆中,然后调用GC.GetTotalMemory 100次,每次之前添加一个新对象所以如果有任何缓存值,它就会过时。

GC.GetTotalMemory(false)的平均执行时间为0,000687毫秒!

我有一个Win 7 64位2 CPU(总共8核)HP,内存为8 GB。

我认为,您的开发人员会在那里有一个很好的指标:)

Default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    private List<object> objects = new List<object>();

    protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 10000000; i++)
        {
            objects.Add(new byte[64]);
        }

        double averageDuration = 0;
        for (int x = 0; x < 100; x++)
        {
            objects.Add(new byte[64]);
            Stopwatch sw = Stopwatch.StartNew();
            Response.Write("Total memory: " + GC.GetTotalMemory(false) + " / ");
            sw.Stop();
            averageDuration += sw.Elapsed.TotalMilliseconds;
            Response.Write("Duration: " + sw.Elapsed.TotalMilliseconds + "<br/>");
        }

        Response.Write("Average Duration: " + (averageDuration / 100));
    }
}