我正在开发需要这么多循环和数组访问来比较数组的应用程序。我在c ++中实现了相同的应用程序,我注意到性能上有很大差异,请注意我在c ++版本中使用了指针而不是基于数组索引的访问。然后我尝试在c ++和C#中实现我的一小部分代码。下面列出了C#代码,使用秒表测量时执行时间为400毫秒。此外,当我将第一个的限制增加到10000时,程序永远不会像死锁那样执行。
int[] A = new int[10000];
int[] B = new int[10000];
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i=0;i<100;i++)
for(int j=0;j<i;j++)
for (int k = 0; k < 10000; k++)
{
A[k] = k;
B[k] = A[k] + j;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
我的问题是如何在c#中提高数组的杀戮性能?
myPC是4GB RAM核心i5 2.2GHz
答案 0 :(得分:2)
我不认为访问数组确实是一个问题。如果我只是增加一个计数器来替换你的循环的内部部分:
int count = 0;
for (int i = 0; i < 100; i++)
for (int j = 0; j < i; j++)
for (int k = 0; k < 10000; k++)
{
count++;
}
在我的机器上执行需要88毫秒,而你的版本需要156毫秒(这是在调试模式下,在没有调试的情况下发布它的速度大约快2倍)。我说这是可以理解的,因为你的代码只在增加计数器时执行2次操作而不是1次操作。
请记住,您的代码进入循环4,950,000次,这很多。如果将外循环增加到10000次重复,则将进入循环499,950,000,000次。
如果我是你,我会考虑优化你的算法,就像其他答案所暗示的那样。如果无法做到这一点,那么至少应该在后台线程上执行此代码,该后台线程具有进度指示器(如果可能,还有一个取消选项)。
答案 1 :(得分:0)
一个。在发布模式下运行
B中。确保手动优化,您的代码在功能上等同于:
for (int k = 0; k < 10000; k++)
{
A[k] = k;
B[k] = A[k] + 99;
}
答案 2 :(得分:0)
就像“versan”所说的那样,你正在进行大量的操作,所以通常需要花费很多时间才能完成。
我使用C#和C ++,你可能对这样的代码唯一不同的是编译器完成的优化(JIT vs GCC)以及GC可以中断你的C#程序来做垃圾的事实收藏品。
C#中的数组访问与使用C ++中的指针基本相同