【问题标题】:C#: Optimize conditional within a loopC#:在循环内优化条件
【发布时间】:2017-02-25 13:41:02
【问题描述】:

我有以下嵌套循环:

  (...)
  while (some_condition)
  {
    (...)
    MyObject p = new MyObject(i, j); 
    for (int r = -1; r <= 1; r++)
    {
        for (int c = -1; c <= 1; c++)
        {
            // check matrix bounds
            if (p.y + r <= 0 || p.y + r >= bound1 ||
                p.x + c <= 0 || p.x + c >= bound2)
            {
                continue;
            }                
            else if (matrix[p.y + r][p.x + c]=='$') // at this point no IndexOutOfBounds may be raised as it is checked in previous condition
            {
                continue;
            }

            AddItem(r, c);
        }
    }
 }

MyObject 是一个具有以下属性的类:

public class MyObject {
      public int x;
      public int y;

      public MyObject(int x, int y)
      {
         this.x = x;
         this.y = y;
      }

      // Other methods ....
}

所以我担心性能,我的意思是,我不喜欢循环内的条件,因为性能可能会降低,那么我该如何优化呢?

另外我想让代码更易读,所以我重写了如下:

 while (some_condition)
 {
    (...)
    MyObject p = new MyObject(i, j); 
    for (int r = -1; r <= 1; r++)
    {
        for (int c = -1; c <= 1; c++)
        {
            if (!IsOutOfBounds(r, c, p) && !IsDollar(r, c, p))
            {
               AddItem(r, c);
            }
        }
    }
 }

 private bool IsOutOfBounds(int r, int c, MyObject p)
 {
    return (p.y + r <= 0 || p.y + r >= bound1 ||
            p.x + c <= 0 || p.x + c >= bound2);
 }

 private bool IsDollar(int r, int c, MyObject p)
 {
   // matrix is global
   return (matrix[p.y + r][p.x + c]=='$');
 }

但是现在,在循环内调用函数也会降低性能,那么内联函数怎么办呢?我必须在这两个函数之前加上 [MethodImpl(MethodImplOptions.AggressiveInlining)] 属性吗?

【问题讨论】:

  • 我认为代码审查网站更适合你。
  • 我还建议先查看他们的help center
  • “不喜欢循环内的条件,因为性能可能会降低” 但作为安慰,它可以节省异常情况。
  • @OusmaneDiaw 我的代码有一些错误,我已经更正了。立即查看。
  • 为什么你需要对 r 和 c 的多个值进行循环。 if(p.y

标签: c# for-loop inline


【解决方案1】:

方法调用和 if 语句不会对您的性能造成太大影响,除非您每秒调用该方法 1000 次,或者您在一台非常旧的机器上,但编译器也会进一步优化。因此,如果您的程序运行缓慢,您应该更加专注于使此类代码更具可读性并寻找真正的瓶颈。

但是我还有一个关于您的代码的问题,您似乎永远不会在循环中更改 x 和 y,所以您不能将越界和美元支票带出循环之外。

【讨论】:

  • 我输入了错误的代码,对不起,现在我已经更正了。再次查看帖子。
  • 请问,你的电脑有多好/旧,你这么担心性能?
  • 我的电脑是新的,但我对这些东西非常偏执,如果可以的话,我总是尽量避免在循环中使用条件。
  • 在一个总共被调用 9 次的循环中的条件可能会花费你几微秒,如果不是更少,很可能比循环中的其他内容要少得多
【解决方案2】:

做得好,使其更具可读性和正确的方法命名。由于 for 循环只执行了 3 次,对于值 -1、0 和 1,只要循环迭代次数很少,性能就不会真正发挥作用。

每次过早和不必要的优化的代码可读性。

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2022-12-04
    • 2020-11-19
    相关资源
    最近更新 更多