c# - 对于二维数组,Array.Copy() 是否比 for 循环更快?

标签 c# performance

我最近变了

        this.FieldValues = new object[2, fieldValues.GetUpperBound(1) + 1];
        for (int i = 0; i < FieldCount; i++)            
        {
            this.FieldValues[Current, i] = fieldValues[Current, i];
            this.FieldValues[Original, i] = fieldValues[Original, i];
        }

        FieldValues = new object[2, fieldValues.GetLength(1)];
        Array.Copy(fieldValues, FieldValues, FieldValues.Length); 

其中 Current 和 Original 的值分别为常量 0 和 1。 FieldValues 是一个字段,fieldValues 是一个参数。

在我使用它的地方,我发现 Array.Copy() 版本更快。但另一位开发人员表示,他在独立程序中针对 Array.Copy() 对 for 循环进行了计时,发现 for 循环速度更快。

有没有可能 Array.Copy() 不是真的更快?我认为它应该是 super 优化的!

最佳答案

根据我自己的经验,我发现在性能方面我不能相信自己的直觉。因此,我保留了一个快速而简单的基准测试应用程序(我称之为“StupidPerformanceTricks”),我用它来测试这些场景。这是无价的,因为我在表演技巧方面做出了各种令人惊讶和反直觉的发现。同样重要的是要记住在 Release模式下运行基准应用程序,不要附加调试器,否则您将无法获得 JIT 优化,而这些优化可能会产生显着差异:技术 A 在 Debug模式下可能比技术 B 慢,但在 Release模式下速度明显更快,代码经过优化。

也就是说,一般来说,我自己的测试经验表明,如果您的数组小于 ~32 个元素,您将通过滚动自己的复制循环获得更好的性能——大概是因为您没有方法调用开销,这可能很重要。但是,如果循环大于 ~32 个元素,您将通过使用 Array.Copy() 获得更好的性能。 (如果您正在复制整数或 float 或类似的东西,您可能还想研究 Buffer.BlockCopy(),对于小型数组,它比 Array.Copy() 快 10%。)

但话虽如此,真正的答案是,“编写您自己的测试以尽可能接近地匹配这些精确的替代方案,将它们分别用一个循环包装起来,为循环提供足够的迭代次数以使其至少咀嚼 2-3秒的 CPU,然后自己比较备选方案。”

关于c# - 对于二维数组,Array.Copy() 是否比 for 循环更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7483893/

相关文章:

c# - Xamarin Forms 事件冒泡和调用自定义渲染器上的操作

c# - 在运行时更改类应用程序中的连接字符串?

c# - 表达式树的sql语句

java - 在 1 GHz 处理器上运行 10-100 千万亿步的算法需要多长时间?

model-view-controller - 如何优化 MVC 和 IIS 管道以获得更高的速度?

c# - 从 Visual Studio 2008 升级到 2015 - 我应该担心什么?

c# - 获取发件人姓名事件处理程序

algorithm - 使用AVX2更快地查找表

java - 确定数组是否包含两个等于某个和的元素?

android - findViewById 的效率