我最近变了
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/