64位方法调用慢C#

0 c# arrays optimization performance 64-bit

我有一个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();
}
Run Code Online (Sandbox Code Playgroud)

由于某些奇怪的原因在32位上,GetClassObj输入速度比64位版本更快,我做错了什么

Jon*_*eet 6

这可能是由于缓存一致性.不要忘记,64位计算机上的每个引用都是32位计算机上的两倍.这意味着:

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

现在可能很容易就是在32位CLR中,你只是在CPU上最快的缓存之一 - 而在64位CLR上你已经不在它之外所以它不得不在内存中交换内存,或者到另一个缓存或主存储器.

这就是为什么x86是VS2010中可执行项目的默认值(可能是2008年;不确定).这篇博文更详细.