C# 堆堆栈中的运行时间

C# 堆堆栈中的运行时间,c#,C#,我创建了一个代码来计算运行时间 它起作用了。但我无法解释:堆和堆栈中的变量有什么区别 我说的是“跑步时间” 我在堆中创建了3个变量:a、b、c 堆栈中有3个变量:aa、bb、cc 我的代码: class Program { private int a = 1; private int b = 2; private int c = 0; static void Main() { int aa = 1; int bb = 2;

我创建了一个代码来计算运行时间

它起作用了。但我无法解释:堆和堆栈中的变量有什么区别

我说的是“跑步时间”

我在堆中创建了3个变量:a、b、c

堆栈中有3个变量:aa、bb、cc

我的代码:

class Program
{
    private int a = 1;
    private int b = 2;
    private int c = 0;

    static void Main()
    {
        int aa = 1;
        int bb = 2;
        int cc = 0;

        var sw = new Stopwatch();
        var _sw = new Stopwatch();

        Program pro = new Program();

        for (int k = 0; k < 10; k++)
        {
            sw.Start();
            for (int i = 0; i < 500000000; i++)
            {
                pro.c += pro.a + pro.b;
            }
            sw.Stop();

            Console.WriteLine("Heap:");
            Console.WriteLine("TotalMiliseconds: {0}", sw.Elapsed.TotalMilliseconds.ToString());
            Console.WriteLine("__________________________________");
            sw.Reset();

            _sw.Start();
            for (int j = 0; j < 500000000; j++)
            {
                cc += aa + bb;
            }
            _sw.Stop();

            Console.WriteLine("Stack:");
            Console.WriteLine("TotalMiliseconds: {0}", _sw.Elapsed.TotalMilliseconds.ToString());
            Console.WriteLine("__________________________________");

            _sw.Reset();
        }
        Console.ReadKey();
    }
类程序
{
私人INTA=1;
私有int b=2;
私有int c=0;
静态void Main()
{
int aa=1;
int-bb=2;
int cc=0;
var sw=新秒表();
var_sw=新秒表();
Program pro=新程序();
对于(int k=0;k<10;k++)
{
sw.Start();
对于(int i=0;i<500000000;i++)
{
专业c+=专业a+专业b;
}
sw.Stop();
控制台.WriteLine(“堆:”);
WriteLine(“TotalMiliseconds:{0}”,sw.appeased.TotalMiliseconds.ToString());
Console.WriteLine(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”);
sw.Reset();
_sw.Start();
对于(int j=0;j<500000000;j++)
{
cc+=aa+bb;
}
_sw.Stop();
Console.WriteLine(“堆栈:”);
WriteLine(“TotalMiliseconds:{0}”,_sw.appeased.TotalMiliseconds.ToString());
Console.WriteLine(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”);
_sw.Reset();
}
Console.ReadKey();
}
}

这里是我的问题:你能告诉我为什么堆中的运行时间总是比堆栈快吗


谢谢

据我所知,您并不是在比较堆栈访问和堆访问,因为这两组变量都是在堆栈上分配的,因为它们都是值类型。请参见此处:

Related:根据您的消息来源,堆比堆栈慢,这与kevin的要求相反。它没有提供堆速度更快的情况的任何信息。当我运行代码时,“heap”循环的执行速度总是较慢,大约为10%。对吗?我的结果是:堆循环总是比堆栈循环快约0.2秒。(Heap:2.0 Stack 2.2-Heap:2.1 Stack:2.4…)事实上,我运行了这个,并且对我来说,堆总是比堆栈花费更长的时间。我想stakx是对的,这完全依赖于运行时环境。奇怪的是,当我颠倒内部循环的顺序时,两者之间的差异减小了。值类型/引用类型二分法在这里并没有真正发挥作用。唯一相关的方面是,值类型字段
a
b
c
被“嵌入”到它们的
程序
实例中,也就是说,它们存储在适当的位置,而不是位于其他地方,并且只能从
程序
实例内部引用。由于OP是
新的
-ing一个
程序
实例,因此可以推测它将落在“堆”上。人们可以推测,局部变量总是落在“堆栈”上。但这只是猜测。对象是放在“堆栈”还是“堆”上,以及这些构造是否首先存在,主要是运行时环境(CLR)的实现细节和选择,而不是可以强制进入或通过查看源代码了解的内容。(也就是说,CLR确实是根据固定的规则工作的,因此新的实例可能真的会出现在堆上,而本地变量会出现在寄存器或堆栈上。)@stakx如果你是正确的,那么你可能应该把它作为答案,而不是在评论中说出来。我不确定我的评论是否足以回答实际问题。我只是想让他们解释为什么我否决了你的答案(对不起)。我会考虑的。