我处于这样一种情况:我正在迭代许多记录并根据这些记录中的数据设置状态信息。像这样的东西(不是真正的代码,只是简化):
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;
}
答案 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秒。
编写最简单的代码,稍后对其进行优化。