0

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

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;
}
4

3 回答 3

2

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

于 2012-07-26T12:46:18.340 回答
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 

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

写最简单的代码,以后再优化。

于 2012-07-26T13:05:33.927 回答
0

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

正如@harold 在他的评论中所说:“试试看。” 分析您的代码并了解什么是昂贵的,什么不是。结果很可能不是你所期望的!

于 2012-07-26T12:56:53.523 回答