C#中的数组访问操作性能非常差

时间:2015-07-21 22:33:22

标签: c# arrays performance optimization

我正在开发需要这么多循环和数组访问来比较数组的应用程序。我在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

3 个答案:

答案 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 ++中的指针基本相同