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位机器上的大小是在32位机器上的两倍。这意味着:
- 每个实例对象都将变得更大,因此它们将在内存中进一步分散(无论如何,在x64中每个对象的开销更多,并且任何引用字段将是大小的两倍)
- 数组本身的大小大约是原来的两倍
现在很容易在32位CLR中,你只是在CPU上最快的缓存之一内-而在64位CLR中,你已经超出了它,所以它必须在缓存中交换内存,要么到另一个缓存,要么到主存。
这就是为什么x86是VS2010中可执行项目的默认值(可能还有2008;不确定)。
为什么它应该更快呢?64位的指针操作是64位的两倍重(在内存方面),所以64位的应用程序自然会更慢。