【发布时间】:2011-11-01 18:17:58
【问题描述】:
嗨,我有一个 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 位版本上更快 我做错了什么
【问题讨论】:
-
显示调用GetClassObj的代码
-
为什么你有 300 个子类。你能举一个更实际的例子吗,它实际上慢了多少?
-
@michael,不太清楚:您是在 64 位下编译代码并运行还是只运行 32 位的二进制 compilef?
-
这个设计闻起来一点也不对,但至少可以缓解你的痛苦:
object[] retObj = Enumerable.Range(0, 300).Select(n => Activator.CreateInstance("MyAssembly", "MyClass.subclass" + n)).ToArray();。 -- 如果类不使用重叠引用,这甚至可以使用 PLinq 自动并行化。 -
您要解决什么现实问题?即使在 64 位上实例化 300 个类需要 3 倍的时间,但如果你只做一次也没什么大不了的。
标签: c# arrays performance optimization 64-bit