网站首页 > java教程 正文
作为程序员,你用过三元运算没?我们见的最多的三元运算其实就是一个问号加一个冒号组成,表现为"条件表达式 ? 表达式1 : 表达式2"。也就是,当条件表达式结果为true的时候,三元运算返回表达式1计算后的值,反之为false的时候,三元运算返回表达式2计算后的值。当然了,条件表达式、表达式1、表达式2本身均可以嵌套其它多层三元运算逻辑,也可以是带有返回值的函数,等等。
有人说三元运算的效率没有直接写if语句高,很多写代码将近十年的程序员,也不知道如何正确的去验证这个说法。比如有的程序员就写个demo模拟三元运算和if语句同时执行相同判断,造一百万条数据,判断结果的时间到底谁大谁小,甚至由自己的测试时间结果,给出大多数情况下三元运算更快的结论。
其实三元运算你也可以看作像是编程语言的“语法糖”,是编程语言给与程序员的一种相对简洁的语法方式来完成本来需要若干行更长的代码才能完成的工作。因此,要验证比较三元运算和if语句的运行效率,我们需要深入具体的某个编程语言,具体分析。如果是C、C++之类编译成机器码然后执行的语言,我们可以分析三元运算和if语句的汇编结果;如果是Java类的字节码执行的语言,我们需要去深入分析java编译成字节码后的结果;如果是javascript、python类的解释器执行的语言,我们需要去分析解释后的结果。依此类推。
下面,我们以分析C、C++语言的三元运算为目标,以gcc编译器为例,分析一下。
图左边t.c源程序是用if语句,a的值是1000,如果a的值大于100则return 10,否则return20;图右边t2.c是等价的使用三元运算的源程序。
我们用
gcc -S t.c -o t.s
gcc -S t2.c -o t2.s
分别用-S选项将t.c和t2.c编译成汇编语句,如下图:
左右两边分别是t.s和t2.s,可以看出三元运算和if语句经过汇编后的语句是一模一样的,除了语句的标号两次编译的选择不同而已,完全不影响实际运行。
因此,有些人用一些所谓的性能测试代码草率的得出结论三元运算和if语句效率孰优孰劣的结论,是一些不准确且片面的结论,既受测试环境的影响,也局限于测试代码的不全面。本文的结论从一个小例子出发,利用编译后的汇编代码分析比较,至少证明了在gcc编译器下两者是一样的。当然,不同的编译器,不同的优化选项,甚至在不同类型的语言如Java的虚拟机字节码、Python的解释器执行等,实际效率差别还需要大家使用本文的思路亲自进行分析验证。
猜你喜欢
- 2024-10-30 零基础学习JAVA-04.运算符(零基础学java全集)
- 2024-10-30 详解Python开发中的三元表达式#三元表达式#布尔类型
- 2024-10-30 十七、Java选择控制语句(java中提供了哪两种实现选择控制的语句)
- 2024-10-30 第一章:java基本语法之运算符和表达式(2)
- 2024-10-30 这几个牛B的Python语法,你需要了解下
- 2024-10-30 C语言三目运算符背后技术详解(c语音中的三目运算符)
- 2024-10-30 Day15-Python基础知识-条件表达式(三元操作符)
- 2024-10-30 CSP-NOIP信息学竞赛(33)三目运算符 问号表达式 if else
- 2024-10-30 9个小技巧让你的 if else看起来更优雅
- 2024-10-30 Java练习一(基础语法)|Java程序设计
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)