【问题标题】:C# computationally expensive , how to make it fasterC# 计算成本高,如何使其更快
【发布时间】:2011-08-12 13:16:14
【问题描述】:

我知道这是一个愚蠢的问题,为什么这个代码 minX 在计算上很昂贵,但我想,有人可能会告诉我我的错误。谢谢

// getMap is a 2 dimentional array of type short I need to find maxX,minX,maxY,minY 
//Can't use Math.Min , as it will get the lower bound i.e 0, i want values after filtering
for (int X = 0; X < getMap.GetLength(0); X++)
{       
    for (int Y = 0; Y < getMap.GetLength(1); Y++)
    {           
        if((short)getMap.GetValue(X,Y) !=  0)
        {
           //if i take it out, it works fine ,I need to 
            if (minX > X )
                minX = X;
            else
                X = minX;
        // Prints some stuff and does other computation 
        }
    }
}
// Draws image 

【问题讨论】:

  • 它的计算成本很高,因为它要遍历 2D 数组中的每个元素。你还在寻找什么?
  • 为什么要更改内部循环内循环变量 X 的值?
  • 这将有助于回答您的问题:在二维数组中写入值表。然后让我们知道您正在寻找的结果。只是作为一个初学者......
  • 计算上的昂贵是“不会终止”的轻描淡写。

标签: c# .net performance multidimensional-array


【解决方案1】:

else X = minX; 部分没有多大意义。它可能会导致无限循环,因为您将循环变量 X 设置为较低的值。

只有当最多 1 列包含非零值时,您的代码才会终止(假设您将 minX 初始化为一个较大的值)。

例如,假设X=0X=1 列在某处都包含一个非零值。然后,当它达到 0 列中的非零值时,minX 被设置为 0。然后它用X=1 达到非零值时注意到minX&gt;X 为假,并将 X 设置回 0。并永远重复。

【讨论】:

  • 在大多数情况下,这似乎会造成无限循环。
【解决方案2】:

我不知道 (short)getMap.GetValue(X,Y)getmap[X,Y] 相比如何,但似乎过于复杂。

您可以做的是将short[,] getMap 替换为short[][] getMap

Array-of-array(锯齿状数组)在这些嵌套循环场景中通常更快,因为 Jitter 可以更好地优化范围检查。

【讨论】:

  • 我猜getMap.GetValue 会导致每个项目被装箱,然后演员将其拆箱。如果有很多值,所有这些装箱/拆箱操作都会占用处理器周期。
  • getMap() 有一个值,我过滤掉任何大于 0 的值,用于计算最小值和最大值
  • @Don:是的,它有一个值,但这不是调用 GetValue() 的理由。但请先阅读 Chaos 的答案。你的代码有缺陷。
  • 谢谢大家,替换为 minX = Math.Min(minX, X); minY = Math.Min(minY, Y); maxX = Math.Max(maxX, X); maxY = Math.Max(maxY, Y);
猜你喜欢
  • 2011-02-28
  • 2021-11-28
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多