【问题标题】:Multiple refrences to an element in an array vs assigning that element to a variable [duplicate]多次引用数组中的元素并将该元素分配给变量[重复]
【发布时间】:2019-12-18 08:09:58
【问题描述】:

如果我对数组中的同一个元素进行多次引用,在性能方面,将那个元素分配给一个变量并改为引用这个变量会更好吗?我知道这会使代码更具可读性,而且通常更重要,但要严格查看代码的性能——哪种方式更好?

public Class Example
{
    public void ExampleOne()
    {
        //Assuming the values in the array are random.
        int[,] arr = new int[10,10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if(arr[i, j] < 5 || (arr[i, j] > 10 && arr[i, j] < 20)) 
                {
                    arr[i, j] = 0;
                }
                else
                {
                    arr[i, j] = 1;
                }
            }
        }
    }

    public void ExampleTwo()
    {
        //Assuming the values in the array are random.
        int[,] arr = new int[10,10];
        int val;
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                val = arr[i, j];
                if(val < 5 || (val > 10 && val < 20)) 
                {
                    arr[i, j] = 0;
                }
                else
                {
                    arr[i, j] = 1;
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# arrays performance


    【解决方案1】:

    我已经对您使用不同大小的数组的两种方法进行了基准测试,并且....如果数组的元素小于 640000 左右,那么第二个是最快的。否则,如果元素超过 640000 左右,则速度更快的是第一个。

    
    static void ExampleOne()
            {
                Stopwatch stopwatch = Stopwatch.StartNew();
    
                //Assuming the values in the array are random.
                int[,] arr = new int[10, 10];
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        if (arr[i, j] < 5 || (arr[i, j] > 10 && arr[i, j] < 20))
                        {
                            arr[i, j] = 0;
                        }
                        else
                        {
                            arr[i, j] = 1;
                        }
                    }
                }
    
                Console.WriteLine(stopwatch.ElapsedTicks);
                stopwatch.Stop();
            }
    
            static void ExampleTwo()
            {
                Stopwatch stopwatch = Stopwatch.StartNew();
    
                //Assuming the values in the array are random.
                int[,] arr = new int[10, 10];
                int val;
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        val = arr[i, j];
                        if (val < 5 || (val > 10 && val < 20))
                        {
                            arr[i, j] = 0;
                        }
                        else
                        {
                            arr[i, j] = 1;
                        }
                    }
                }
    
                Console.WriteLine(stopwatch.ElapsedTicks);
                stopwatch.Stop();
            }
    

    【讨论】:

    • 很遗憾,我无法重现您的结果。我尝试对不同大小的数组进行测试以获得更好的平均值。对我来说,这两种方法花费的时间大致相同(27 因子似乎有点高),但它们并不一致。对于一个 1000x1000 的数组,它需要 300000 到 400000 个滴答声,有时一种方法比另一种更好,有时则相反。
    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多