日期:2014-05-17  浏览次数:20806 次

让我们来纠结一下C#的效率问题
我一直在纠结这个问题:

C# code

// 有一个函数 

private string dosomething(data[] anyarray)
{
   // 例如将数据转换为ascii字符串
   // 其他问题先不考虑
}

// 我在某个函数中 必须要使用这个dosomething 函数

//例如里面的代码是这样的

public void allowdataArray(any)
{
  if(dosomething(any).indexof("abc")>=0)
  {
      return;
   }

   otherfunction(dosomething(any));
}
// 在这个函数中我使用里两次dosomething(any),也就是说我执行了两次dosomething中的代码
// 但是我如果这样做

public void allowdataArray(any)
{
  string temp=dosomething(any);

  if(temp.indexof("abc")>=0)
  {
      return;
   }

   otherfunction(temp);
}

// 那么表示我执行了一次函数





但是接下来的问题就是 :

使用函数返回值 那么我就会多次运行里面的代码,实际运用中可能会调用多次,那么就会执行多次

如果我使用一个变量来保存这个值,那么就是说我只是执行了一次,但是我又做了新建一个变量,然后对这个变量赋了值,然后又要引用,但是这个途中,我并没有对这个变量进行运算等操作,


那么到底是哪个方式比较快呢?


求解




allowdataArray(any)的使用很频繁的 ,所以我不得不纠结这个问题,或者有没有更好的处理方式?


------解决方案--------------------
只要你调用dosomething就会执行,所以用变量保存结果,后续都访问变量
------解决方案--------------------
没必要纠结。
你认为“引用一个对象进行比较或运算”快,
还是“经过运算得到一个对象,再进行该对象的比较或运算”快?
------解决方案--------------------
这还用想吗?少做了几次运算当然是快的
C# code
class MyList
{
  public static int Count
  {
      get
     {
        Sleep(1000);
        return 10;
     } 
  }
}


void Func()
{
   int count = MyList.Count;
   for(int i = 0;i < count;i++)
   {}
}

void Func()
{
   for(int i = 0;i < MyList.Count;i++)
   {}
}

------解决方案--------------------
直接通过anyarray来判断是否需要转换



------解决方案--------------------
探讨
引用:

只要你调用dosomething就会执行,所以用变量保存结果,后续都访问变量


其实有人这样告诉我,如果一个变量从产生到完成使用,这个过程中 ,他的值没有变过,那么,这样的变量就不应该产生.
他的意思大约是这样,变量是用来"变"的,但是你都不变 ,那么就不要使用....

------解决方案--------------------
探讨
引用:

没必要纠结。
你认为“引用一个对象进行比较或运算”快,
还是“经过运算得到一个对象,再进行该对象的比较或运算”快?

从直观是我也是倾向于你的看法,
但是我就是向知道 ,新建一个变量,赋值,引用,也是需要消耗时间的...
我就是纠结这个时间到底值不值得呢?

------解决方案--------------------
探讨

引用:

只要你调用dosomething就会执行,所以用变量保存结果,后续都访问变量


其实有人这样告诉我,如果一个变量从产生到完成使用,这个过程中 ,他的值没有变过,那么,这样的变量就不应该产生.
他的意思大约是这样,变量是用来"变"的,但是你都不变 ,那么就不要使用....

------解决方案--------------------
用这么点内存换时间是值得的,至于你说的有人跟你说的那个什么有点偏激,是看情况而定的