估计.NET(VS)中的内存使用情况

时间:2009-12-18 18:04:08

标签: .net visual-studio performance

我读了一篇关于字符串方法"a" + b与string.Format(“a {1}”,b)的性能的文章,并决定进行测试。

我的代码存在于WinForms应用程序中(VS 2005,但对2005/2008年都感兴趣)。

    private void button1_Click(object sender, EventArgs e)
    {
        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();
        for (int i = 0; i < 10000; i++)
        {
            Console.Write("1" + 2 + "3" + 4 + "5");
        }
        stopwatch.Stop();
        Console.WriteLine("**********");
        Console.WriteLine("'A'+'B'+'C'... 10 000 elapsed: {0}", 
            stopwatch.Elapsed.ToString());
        Console.WriteLine("**********");
        stopwatch.Reset();

        stopwatch.Start();
        for (int i = 0; i < 10000; i++)
        {
            Console.Write(string.Format("1{0}3{1}5", 2, 4));
        }
        stopwatch.Stop();
        Console.WriteLine("**********");
        Console.WriteLine("string.Format((A)B(C)...) 10 000 elapsed: {0}", 
            stopwatch.Elapsed.ToString());
        Console.WriteLine("**********");

    }
在我的机器上

输出如下:


... 12345123451234512345123451234512345123451234512345123451

'A'+'B'+'C'... 10 000已过去:00:00:0 9.4217880


... 12345123451234512345123451234512345123451234512345123451

string.Format((A)B(C)......)10 000已过去:00:00:0 9.8507060


所以,时间几乎相同。

现在,我想知道我用了多少内存。有没有办法比较内存使用量和GarbageCollector工作?

我下载了一个试用版.NET内存配置文件......但也许有一种更简单的方法(上面的代码)方法来检测两次迭代所花费的内存?

感谢。

2 个答案:

答案 0 :(得分:1)

GC.GetTotalMemory可能足够准确:

http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx

否则,您可以通过System.Diagnostics.PerformanceCounter使用CLR GC堆性能计数器。

答案 1 :(得分:1)

我的推荐是......

我会在循环中取出console.writeline,因为Console.WriteLine会在经过的时间内引入自己的观察者效果。只需将其分配给变量或类似。

你也可能没有给String.Format一个公平的休息时间...你不知道GC是否在你的两个循环之间运行。当你进入第二个循环时,GC可能正在开始,这会扭曲你的时间。或者它可能根本没有踢。我确信这一点或以相反的顺序运行测试以确保。

字符串是一般情况下的特例。 .NET中字符串的许多问题实际上来自windows如何处理字符串。我可以说的最好的方法是字符串不像其他对象那样干净,所以我可以做任何事情来避免创建比我需要的更多的字符串。当然,我们处理很多字符串,因为这就是我们所做的,所以我只谈论构建额外的字符串。

示例:从具有String.Format的模板构建SQL命令似乎很酷(“从{1}中选择{0},其中{2}”,selectStmt,fromStmt,whereStmt),但保持效率更高选择你需要作为consts或类似的东西,特别是如果你要解雇它们并一遍又一遍地构建相同的字符串。它也 less 易受SQL注入的影响(此时并未深入研究)。这仅仅是举例,我并没有声称你不应该使用ORM等。

查看http://blog.briandicroce.com/2008/02/04/stringbuilder-vs-string-performance-in-net/