C#底层原理问题

花猫阳 2014-06-20 04:38:40
if( (复杂表达式) == false ) 和 if(!(复杂表达式) ) 哪个的执行速度更快,为什么?
...全文
787 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
极品老土豆 2014-06-23
  • 打赏
  • 举报
回复
引用 29 楼 Z65443344 的回复:
实际上a!=1等价于!(a==1) 先判断a是否等于1,然后结果取反就行了
可笑。
於黾 2014-06-23
  • 打赏
  • 举报
回复
实际上a!=1等价于!(a==1) 先判断a是否等于1,然后结果取反就行了
於黾 2014-06-23
  • 打赏
  • 举报
回复
引用 27 楼 DBAXMMDS 的回复:
看底层编译问题了, 如果 if(!(复杂表达式) ) 编译为 非true,那么这个表达式最慢。 因为要证明a=1很容易,要证明a!=1,很难。
有什么难的,二值逻辑,不是相等就是不相等,不存在第三态. 既然能证明a=1,就能证明b!=1
极品老土豆 2014-06-23
  • 打赏
  • 举报
回复
看底层编译问题了, 如果 if(!(复杂表达式) ) 编译为 非true,那么这个表达式最慢。 因为要证明a=1很容易,要证明a!=1,很难。
yun738243875 2014-06-23
  • 打赏
  • 举报
回复
CPU对一元运算的计算理论上来说是比二元运算快一点。
romanchaos 2014-06-23
  • 打赏
  • 举报
回复
编译后两者一样快,但个人还是建议第二种,代码更简洁。
月影 2014-06-23
  • 打赏
  • 举报
回复
引用 17 楼 fangzuli 的回复:
[quote=引用 16 楼 gentle_wolf 的回复:] [quote=引用 15 楼 fangzuli 的回复:] [quote=引用 13 楼 gentle_wolf 的回复:] [quote=引用 4 楼 fangzuli 的回复:] 楼主说的本人解答捕鸟,因为没积分,所以到这里请教大家一个问题,希望能得到解决! 在asp.net在后台方法中给 web控件属性赋值,比如 给image 的imageUrl赋值 为什么提示“未将对象引用设置到对象的实例”!如何解决呢?麻烦知道的回答一下下~~~谢谢楼主~~谢谢大家!
可能是你赋值的位置不对,image控件还没有被实例化。在load中应该没问题吧? 我已经6年没做asp。net了。若说的不对,多多包涵。[/quote] 摁,我用的ajax访问的后台静态方法,在静态方法里面找到的asp.net控件,找到了,运行时它就出错了。~[/quote] 这种错误是低级错误。[/quote] 这个如何解决呢。我也实例化了。。但是运行还是提示错误![/quote] 你还是找本书看看吧,先把原理弄清楚了再说。我不搞asp.net很多年了,爱莫能助!
祥子爱游戏 2014-06-23
  • 打赏
  • 举报
回复
引用 4 楼 fangzuli 的回复:
楼主说的本人解答捕鸟,因为没积分,所以到这里请教大家一个问题,希望能得到解决! 在asp.net在后台方法中给 web控件属性赋值,比如 给image 的imageUrl赋值 为什么提示“未将对象引用设置到对象的实例”!如何解决呢?麻烦知道的回答一下下~~~谢谢楼主~~谢谢大家!
第一个逗号让人搞不懂你的”因为“是在说什么东西
於黾 2014-06-23
  • 打赏
  • 举报
回复
在普通电脑上测试,基本测不出来区别. 本身电脑CPU时钟就不是很稳定. 循环100亿次,执行if,时间大约在30秒左右 上下能差2秒... 如果仅仅是快一点点,根本测不出来. 除非一个语句的效率比另一个慢一半才能看出明显效果.
相思梦 2014-06-23
  • 打赏
  • 举报
回复
你可以去看看Windows能够允许我们程序猿最低延迟计时器 是1μs/微秒,这种延迟称为高精度延迟,通常用于ASM或C C#同样也可以,不过有些蛋疼
相思梦 2014-06-23
  • 打赏
  • 举报
回复
引用 35 楼 Windowsvipcuvs 的回复:
! 取反速度快一点 如果你想知道谁快 就自己用WinAPI看 GetCurrentThread() // 取当前线程伪句柄 GetTheardTimes() // MSDN 自己查 lpCreationTime FILETIME,指定一个FILETIME结构,在其中装载线程的创建时间 lpExitTime FILETIME,指定一个FILETIME结构,在其中装载线程的中止时间 lpKernelTime FILETIME,指定一个FILETIME结构,在其中装载线程花在内核模式上的总时间 lpUserTime FILETIME,指定一个FILETIME结构,在其中装载线程花在用户模式上的总时间
我贴出自己让你可以去实践一下,到底谁快谁慢 简单的说如果(!)取反Bool值得话,是要比==相等快一些 不过也只是几十微秒的差距,完全可以忽略不计,就看你搞得什么高端东西
相思梦 2014-06-23
  • 打赏
  • 举报
回复
! 取反速度快一点 如果你想知道谁快 就自己用WinAPI看 GetCurrentThread() // 取当前线程伪句柄 GetTheardTimes() // MSDN 自己查 lpCreationTime FILETIME,指定一个FILETIME结构,在其中装载线程的创建时间 lpExitTime FILETIME,指定一个FILETIME结构,在其中装载线程的中止时间 lpKernelTime FILETIME,指定一个FILETIME结构,在其中装载线程花在内核模式上的总时间 lpUserTime FILETIME,指定一个FILETIME结构,在其中装载线程花在用户模式上的总时间
梦吟情诗 2014-06-23
  • 打赏
  • 举报
回复
对于现在的计算机,你这2种写法对计算机来说都不是个事,效率差不多。
於黾 2014-06-23
  • 打赏
  • 举报
回复
其实加减乘除比较这些,在CPU单元里都是一个运算周期搞定的 除非是没有集成乘法器的单片机,乘法是通过循环累加实现的. 不过是占用一个通道还是两个通道的区别.
zdczdccccc 2014-06-23
  • 打赏
  • 举报
回复
觉得取反效率高
於黾 2014-06-23
  • 打赏
  • 举报
回复
引用 30 楼 DBAXMMDS 的回复:
[quote=引用 29 楼 Z65443344 的回复:] 实际上a!=1等价于!(a==1) 先判断a是否等于1,然后结果取反就行了
可笑。[/quote] 有病 何弃疗
泡泡龙 2014-06-22
  • 打赏
  • 举报
回复
你可以看看汇编代码的时钟周期
Delta 2014-06-22
  • 打赏
  • 举报
回复
路过,看看。。。以前也是==true,后来就直接简略了。
bios8086 2014-06-22
  • 打赏
  • 举报
回复
楼主 我只想说 这个问题真的很无聊
showjim 2014-06-21
  • 打赏
  • 举报
回复
bool本质上是一个byte,0表示false,非0表示true(正常情况下1表示true)。 == true 与 != false 都等价于 != 0。 == false 与 !=true 都等价于 == 0。 取反!就是把==与!=互换。 所以楼主的两个表达式最终都是
if ((byte)X ==0)
加载更多回复(17)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧