在循环中,每次设置状态值或检查它是否已更改然后设置它是否更有效?

时间:2012-07-26 12:41:48

标签: performance getter-setter

我处于这样一种情况:我正在迭代许多记录并根据这些记录中的数据设置状态信息。像这样的东西(不是真正的代码,只是简化):

StateObject state;
ConcurrentQueue<Record> records;

while(!records.IsEmpty()) 
{
  //set state here based on the next record
}

那么,

会更有效/更好吗?
{
  //set state here based on the next record
  Record r = records.next();
  state = r.state;
}

{
  //set state here based on the next record
  Record r = records.next();
  if(state != r.state)
    state = r.state;
}

3 个答案:

答案 0 :(得分:2)

这完全取决于您的记录类型。在某些情况下,第一个更好,在某些情况下,第二个更好。

答案 1 :(得分:0)

正如你自己所说,这是一种简化。实际答案取决于您的具体情况:您可能正在运行到世界另一端的数据库,在这种情况下,更新可能会非常昂贵。或者,您的状态变量可能是一个大型复杂类型,比较昂贵。

正如@harold在评论中所说:“试试吧。”描述您的代码,并了解什么是昂贵的,什么不是。机会结果将不是您所期望的!

答案 2 :(得分:0)

测试费用昂贵,我将代码简化为:

int x = 5;

if (x == 5)
    x = 4;

x = 4;

以下是反汇编代码:

                int x = 5;
00000036  mov         dword ptr [rsp+20h],5 

            if (x == 5)
0000003e  xor         eax,eax 
00000040  cmp         dword ptr [rsp+20h],5 
00000045  setne       al   
00000048  mov         dword ptr [rsp+28h],eax 
0000004c  movzx       eax,byte ptr [rsp+28h] 
00000051  mov         byte ptr [rsp+24h],al 
00000055  movzx       eax,byte ptr [rsp+24h] 
0000005a  test        eax,eax 
0000005c  jne         0000000000000066 
                x = 4;
0000005e  mov         dword ptr [rsp+20h],4 

            x = 4;
00000066  mov         dword ptr [rsp+20h],4 

话虽如此,过早优化是浪费时间。数据库调用可能需要一秒钟,上面的调用可能需要.00000001秒。

编写最简单的代码,稍后对其进行优化。