C#-比较运算符的执行效率
写c#代码的时候突然无意中注意到一个问题,就是c#中比较运算符的实现是怎样的呢?执行效率如何呢?
比如我判断一个数组的长度是否等于0
有如下两种写法:
if(data.length == 0 )
dosomething();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
写c#代码的时候突然无意中注意到一个问题,就是c#中比较运算符的实现是怎样的呢?执行效率如何呢?
比如我判断一个数组的长度是否等于0
有如下两种写法:
if(data.length == 0 )
dosomething();
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
第一段代码是C#
int i = 0;
if (i == 0)
{
;
}
if (i <= 0)
{
;
}
下面第二段是汇编代码,可以看到两种比较到底有何区别:
比较都是用的CMP指令,两种比较的汇编码,唯一不同的是判断句setne和setg
setne al 不等为真(用来判断是否相等)
setg al 大于零为真(用来判断是否小于等于)
如果有x86指令周期表,查这两句的指令周期就能知道结果。
可惜手头没有,所以很抱歉,只能凭记忆说了,同一类指令一般都是相同耗时的,而且setne和setg只是置位寄存器,应该都是1个时钟周期。
所以,两种比较语句的速度是一样的。(当然,还需要x86指令周期表证明)
int i = 0;
00000035 xor edx,edx
00000037 mov dword ptr [ebp-3Ch],edx
if (i == 0)
0000003a cmp dword ptr [ebp-3Ch],0
0000003e setne al
00000041 movzx eax,al
00000044 mov dword ptr [ebp-40h],eax
00000047 cmp dword ptr [ebp-40h],0
0000004b jne 0000004F
{
0000004d nop
;
}
0000004e nop
if (i <= 0)
0000004f cmp dword ptr [ebp-3Ch],0
00000053 setg al
00000056 movzx eax,al
00000059 mov dword ptr [ebp-40h],eax
0000005c cmp dword ptr [ebp-40h],0
00000060 jne 00000064
{
00000062 nop
;
}
00000063 nop