64位方法调用慢c#

本文关键字:调用 方法 64位 | 更新日期: 2023-09-27 18:06:28

嗨,我有一个32位的应用程序移植到64位64位的方法调用比32位的要慢得多。

代码范例
    class huge_class
{
 class subclass0{}
 class subclass1{}
 class subclass2{}
 class subclass3{}
 class subclass4{}
 class subclass5{}
 class subclass6{}
 class subclass7{}
 //so on... say 300
 private object[] GetClassObj(Stopwatch x)
 {
       Console.WriteLine(x.ElapsedMilliseconds.ToString()); //<- the latency can be observed here, the time it takes to execute this line takes a big amount of time
       object[] retObj = new object[300];
       retObj[0] = new subclass0();
       retObj[1] = new subclass1();
       retObj[2] = new subclass2();
       retObj[3] = new subclass3();
       retObj[4] = new subclass4();
       retObj[5] = new subclass5();
       retObj[6] = new subclass6();
            //so on... to 299
 }
}
    Class CallingClass{
  static void Main(string[] args)
    {

        Console.WriteLine("Ready");
        Console.ReadKey();
        huge_class bigClass = new huge_class();
        Console.WriteLine("Init Done");
        Console.ReadKey();
        Stopwatch tmr = Stopwatch.StartNew();
        object[] WholeLottaObj = bigClass.GetClassObj(tmr);
        Console.WriteLine(tmr.ElapsedMilliseconds.ToString());
        Console.WriteLine("Done");
        Console.ReadKey();
}
由于一些奇怪的原因,在32位上输入GetClassObj要比在64位上输入快我做错了什么

64位方法调用慢c#

这可能是由于缓存一致性。不要忘记,每个引用在64位机器上的大小是在32位机器上的两倍。这意味着:

  • 每个实例对象都将变得更大,因此它们将在内存中进一步分散(无论如何,在x64中每个对象的开销更多,并且任何引用字段将是大小的两倍)
  • 数组本身的大小大约是原来的两倍

现在很容易在32位CLR中,你只是在CPU上最快的缓存之一内-而在64位CLR中,你已经超出了它,所以它必须在缓存中交换内存,要么到另一个缓存,要么到主存。

这就是为什么x86是VS2010中可执行项目的默认值(可能还有2008;不确定)。

为什么它应该更快呢?64位的指针操作是64位的两倍重(在内存方面),所以64位的应用程序自然会更慢。