user-0 提问: 如何高效地判断两个数是否有一个等于0

回复:
user: user-1
content: 引用 46 楼 JLU_Leven 的回复:[quote=引用 45 楼 zhao4zhong1 的回复:] [quote=引用 30 楼 hjgzj 的回复:] 可惜没赵老师的模版 理解和讨论之前请先学会如何观察！  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  [/quote] profiler是什么东东[/quote] VC6：   Articles That Tell About Performance Tuning Home |  Overview |  How Do I  Feature Only in Professional and Enterprise Editions   Profiling is supported only in Visual C++ Professional and Enterprise Editions. For more information, see Visual C++ Editions.  The profiler-related articles are as follows:   PREP   PROFILE   PLIST   Profiler Won't Merge Statistics from Two Different Operating Systems on the Same Computer   Profiler Will Not Profile DLLs That Are Freed, Then Reloaded   Onboard System Memory Cache and Disk Caches May Affect Profile Times   Profiling Windows NT Services   Error Writing to .PDB File After Line Profile Operation   PRB: Profiler Fatal Errors PRF1012 and PRF1306   VS 20XX：  全部折叠全部展开      代码：全部 代码：多个 代码：Visual Basic 代码：C# 代码：Visual C++ 代码：J# 代码：JScript   Visual Basic C# Visual C++ J# JScript Visual Studio Team System  使用分析工具对应用程序性能进行分析  请参见  发送反馈意见     使用 Visual Studio Team Edition for Developers 中的性能工具，开发人员可以测量和评估代码中的性能相关问题，并以这些问题作为目标。这些工具与集成开发环境完全 (IDE) 全面集成，提供无缝的用户体验。性能工具支持两种分析方法，即取样和检测。  分析应用程序的过程非常简单。首先，创建一个新的性能会话。在 Visual Studio Team Edition for Developers 中，可以使用性能会话向导创建新的性能会话。性能会话结束后，分析过程中收集的数据将保存到 .vsp 文件中。可以在 IDE 中查看 .vsp 文件。有几个报告视图用于根据收集的数据可视化和检测性能问题。  通过命令行可以使用性能工具。因此，用户可以灵活选择是从命令行运行这些工具，还是使用它们自动完成使用脚本的任务。  有关与性能和分析相关的当前/高级主题的更多信息，请搜索 Microsoft Developer Network 以获取主题和 Microsoft 博客。使用关键字 Enterprise Performance Tools Team。  本节内容 分析工具入门  了解当您使用分析工具收集、查看和分析代码性能时要应用的概念和任务。  常见任务（分析工具）  了解如何使用性能工具为不同类型的应用程序创建性能会话和收集性能数据。  高级任务（分析工具）  了解如何使用分析工具收集有关复杂或困难情况的性能数据。  查看分析工具报告  了解如何查看性能数据以检测问题。  演练：分析应用程序  通过分析样本应用程序来获得实际体验。  命令行分析工具  了解如何从命令行提示符下使用性能工具。  请参见 其他资源 MSDN Online 发送反馈意见，就此主题向 Microsoft 发送反馈意见。

user: user-1
content: 引用 30 楼 hjgzj 的回复:可惜没赵老师的模版 理解和讨论之前请先学会如何观察！  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-0
content: 引用 43 楼 angel_su 的回复:貌似这个效率可以无视，即便a*b真的快点，换来bug得不偿失... if (65536*65536 == 0) why is true ? 我说了*会溢出，不可取

user: user-0
content: 引用 45 楼 zhao4zhong1 的回复:[quote=引用 30 楼 hjgzj 的回复:] 可惜没赵老师的模版 理解和讨论之前请先学会如何观察！  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  [/quote] profiler是什么东东

user: user-2
content: 楼主也太钻牛角了吧？ 1.项目中的代码，清晰是第一原则，宁可稍微慢点（可忍受范围内）； 2.1-2次比较，0-1次逻辑运算，这已经很快了，做一次乘法运算的消耗，远大于这个。如果改为一次逻辑运算，或许会快点，但你确认联系程序的上下文，这样更容易读懂？

user: user-3
content: 最简单的，也是这最快的！楼主想多了

user: user-4
content: 你又不是直接写汇编，现在编译器智能程度很高了，一般的优化，编译器都帮你做了

user: user-0
content: 引用 28 楼 yangyunzhao 的回复:[quote=引用 楼主 JLU_Leven 的回复:] 给定两个unsigned的数a和b，要判断a和b中是否有一个数等于0，用两次判断（a == 0 || b == 0）肯定能行，用一次判断 a * b == 0容易越界，想问一下有没有其他只使用一次判断就能达到效果的方法  a*b==0的判断 与（a == 0 || b == 0）有多少区别呢？？   	int a = 1, b = 0; 00ECFCBD  mov         dword ptr [ebp-14h],1  00ECFCC4  mov         dword ptr [ebp-20h],0  	if (a*b == 0) 00ECFCCB  mov         eax,dword ptr [ebp-14h]  00ECFCCE  imul        eax,dword ptr [ebp-20h]  00ECFCD2  test        eax,eax  00ECFCD4  jne         main+63h (0ECFCE3h)  	{ 		printf("a"); 00ECFCD6  push        offset string "a" (0FE4CACh)  00ECFCDB  call        @ILT+5515(_printf) (0EC1590h)  00ECFCE0  add         esp,4  	}  	if (a==0 || b==0) 00ECFCE3  cmp         dword ptr [ebp-14h],0  00ECFCE7  je          main+6Fh (0ECFCEFh)  00ECFCE9  cmp         dword ptr [ebp-20h],0  00ECFCED  jne         main+7Ch (0ECFCFCh)  	{ 		printf("b"); 00ECFCEF  push        offset string "b" (0FE4C84h)  00ECFCF4  call        @ILT+5515(_printf) (0EC1590h)  00ECFCF9  add         esp,4  	}  [/quote] 下面有两次je和jne，会中断流水线

user: user-0
content: 引用 31 楼 hemowolf 的回复:楼主搞什么样的应用领域啊，需要考虑这些差异带来的效率影响？ 导弹的实时弹道计算、修正？ 随便想的

user: user-0
content: 引用 9 楼 taodm 的回复:没有经过性能测试，基本上写啥都是误导。 因为，这么简单的用途，没有编译器不能做出强力优化的。 编译器都怎么优化啊，会不会看&&的两个操作数不相关分开计算，从而减少一次有条件跳转

user: user-5
content: 换来bug得不偿失

user: user-6
content: 貌似这个效率可以无视，即便a*b真的快点，换来bug得不偿失... if (65536*65536 == 0) why is true ?

user: user-7
content: 楼主，对于这个的讨论要看情况，如果是一般外部代码，就不要优化了，如果你是要写一个内核这类的，你就对你的想法进行反汇编，看汇编代码的条数就行了。。。。。。。。。。。

user: user-8
content: int main(){ 	int a,b ;  	__asm mov  eax,a 	__asm and  eax,b 	__asm test eax,eax 	__asm je   code }

user: user-9
content: （a == 0 || b == 0）就是效率最高的，不信可以关优化看汇编

user: user-10
content: 或判断足矣，，练好基本功吧先

user: user-11
content: 引用 9 楼 taodm 的回复:没有经过性能测试，基本上写啥都是误导。 因为，这么简单的用途，没有编译器不能做出强力优化的。  恩，需要benchmark来说话，  不过不知道他的目的是什么，感觉上，他一开始提到的（a == 0 || b == 0）要比他想要追求的一次判断的要简单而且效率要高。

user: user-12
content: 我能说学习了嘛

user: user-13
content: 引用 21 楼 xiaohuh421 的回复:debug环境下都看不到, 那只能说明你开了优化.  if(a==0 || b==0) 00923E1B  cmp         dword ptr [a],0    00923E1F  je          CTestDllDlg::OnBnClickedMfcbutton1+67h (0923E27h)   00923E21  cmp         dword ptr [b],0   00923E25  jne         CTestDllDlg::OnBnClickedMfcbutton1+6Eh (0923E2Eh) 怎么关掉？编译器用的还不熟。 我用的是VC6看的。

user: user-14
content: （a == 0 || b == 0）从汇编层面来说已经优化到最好，没有必要从语言的角度来找更优办法