[C#技巧]C#数组矩阵for迭代,顺序不同竟然速度相差15倍
作者:admin 时间:2023-5-6 12:27:3 浏览:在本文中,我们将做一个实验,目的是证明在C#中使用内存局部预取,是可以以获得更好的性能,即是执行速度更快。
我们将看两个例子,我们在矩阵上迭代,并计算有多少元素大于零。为简单起见,假设我们有一个数组数组,大小为 5000×5000。
代码 1:
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix.Length; j++)
{
if (matrix[i][j] > 0) //行先
{
result++;
}
}
}
代码 2:
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix.Length; j++)
{
if (matrix[j][i] > 0) //列先
{
result++;
}
}
}
你认为哪种算法会执行得更快?
如果你猜到了第一个,那你是对的。以下是我们机器上的基准测试结果:
但是,我们应该明白为什么会这样。
数组和矩阵(数组的数组)按顺序存储在内存中,矩阵实际上是按行优先存储的,这意味着当我们逐行访问矩阵数据时,我们将访问后续的内存位置,这就是我们如何从内存局部性原则中受益,并获得改进的性能。
相关文章
- [C#技巧]C#返回空集合的正确方法是使用Array.Empty而不是null
- [C#技巧]C#异常when过滤器捕捉异常使用多个catch的示例代码
- [C#技巧]C#重新抛出异常的正确方法,注意不是throw e!
- [C#技巧]从C#到C# 8、C# 9,简化switch语句越来越惊艳
- [C#技巧]使用using块比没有using块语句消耗更少的内存
- [C#技巧]使用StringBuilder比String消耗内存少
- [C#技巧]new运算符使代码执行速度慢了5倍
- [C#技巧]在for循环外比在for循环内使用try-catch速度快
- 11个提高C#代码性能的技巧
- OutputCache缓存优化asp.net代码 提高网页性能
相关文章
x
- 站长推荐