Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
估计.NET中的内存使用情况(VS)_.net_Visual Studio_Performance - Fatal编程技术网

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

估计.NET中的内存使用情况(VS),.net,visual-studio,performance,.net,Visual Studio,Performance,我读了一篇关于string方法“a”+b与string.Format(“a{1}”,b)性能的文章,并决定进行测试 WinForms应用程序中有我的代码(VS2005,但对2005/2008都感兴趣) private void按钮1\u单击(对象发送者,事件参数e) { 秒表秒表=新秒表(); 秒表。开始(); 对于(int i=0;i

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

WinForms应用程序中有我的代码(VS2005,但对2005/2008都感兴趣)

private void按钮1\u单击(对象发送者,事件参数e)
{
秒表秒表=新秒表();
秒表。开始();
对于(int i=0;i<10000;i++)
{
控制台。写入(“1”+2+“3”+4+“5”);
}
秒表;
Console.WriteLine(“**********”);
WriteLine('A'+'B'+'C'…10000经过:{0}),
秒表.appead.ToString());
Console.WriteLine(“**********”);
秒表复位();
秒表。开始();
对于(int i=0;i<10000;i++)
{
Write(string.Format(“1{0}3{1}5,2,4”);
}
秒表;
Console.WriteLine(“**********”);
Console.WriteLine(“string.Format((A)B(C)…)10000经过:{0}”,
秒表.appead.ToString());
Console.WriteLine(“**********”);
}
在我的机器上,输出如下:


123451234512345123451234512345123451234512345123451234512345123451

“A”+“B”+“C”。。。10000次过去:00:00:09.4217880


123451234512345123451234512345123451234512345123451234512345123451

string.Format((A)B(C)…10000经过时间:00:00:09.8507060


所以,时间几乎是一样的

现在,我想知道我用了多少内存。有没有办法比较一下内存使用情况和垃圾收集器的工作情况

我下载了一个试用版.NET内存分析器。。。但是,也许有一种更简单的方法(如上面的代码)来检测两次迭代中消耗的内存


谢谢。

GC.GetTotalMemory可能足够准确:


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

我的建议是

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

您也可能没有给出字符串。请设置公平间隔。。。您不知道GC是否在两个循环之间运行。GC可能会在您进入第二个循环时启动,从而扭曲您的时间。或者它可能根本就不起作用。我可以肯定这一点,或者也可以以相反的顺序运行测试

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

示例:使用String.Format(“select{0}from{1}where{2}”、selectStmt、fromsmt、whereStmt)从模板构建SQL命令似乎很酷,但更有效的方法是将需要的选择保持为常量或类似值,特别是当您要多次激发它们并反复构建相同的字符串时。它也不太容易受到SQL注入的影响(在这一点上不要离题)。这只是一个例子,我并不是说你不应该使用ORM等等


签出

hm。。。你认为我应该在哪里调用GC.GetTotalMemory?也许在每100次迭代后都这样做,看看这是否能给你一个好的画面。如果您想要一个图形,只需启动性能监视器并添加.Net GC计数器。您应该真正消除控制台。在测试循环中写入。输出速度相对较慢,很可能是瓶颈,而不是在你想要的成绳处。为了支持这一点,我的机器上的第二个时间到了。输出:0.5482043s。无输出:0.0098585s。
    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("**********");

    }