关于if else 和 三目运算符的效率问题(java 版)
2016-02-02 11:24
435 查看
1.从类型转换上看,因为三目运算符在做判断的时候需要考虑到类型转换的问题,而if else 不需要考虑类型转换。
所以 if else 效率高一点。
2.从总体上看
A:需要考虑到循环自身所占用的时间。
B:需要考虑到赋值以及循环内的其他运算符所占用的时间。
所以 三目运算符效率高一点.
结果:
可以看出if else耗时是三目运算符的2.6倍之多!
所以 if else 效率高一点。
2.从总体上看
A:需要考虑到循环自身所占用的时间。
B:需要考虑到赋值以及循环内的其他运算符所占用的时间。
所以 三目运算符效率高一点.
接下来一段代码来演示 2.
public class TestIfElse { public static void main(String[] args) { double f = 0; final int times = 100; double min = 1000; double max = 0; //取100次平均。其实可以再多,但是耗时太长了,意义并不是很大。 for(int i=0; i<times; i++){ double df = test(); System.out.println("df["+i+"] = "+df); f +=df; if(min>df){ min = df; } if(max<df){ max = df; } } f /=times; System.out.println("------->min = "+min); System.out.println("------->max = "+max); System.out.println("------->ave = "+f); } private static double test(){ //来点计算,用处不大。 long sum = -1; //循环次数,有点大哦,自己悠着点调 final int max = 100000000; //下面给出一个包含循环和计算的耗时统计,作为一个基础。后面的统计必然包含此部分时间 long timeS = System.currentTimeMillis(); for(int i=0; i<max; i++){ sum = i+i; } long timeE = System.currentTimeMillis(); long delta = timeE - timeS; //计算出一个布尔值,免得后面还要计算而占用时间,造成误差。 boolean flag = sum>0; //下面是If/Else(包含循环和计算)的耗时统计,真实耗时应当除去上面的基准值 long timeS1 = System.currentTimeMillis(); for(int i=0; i<max; i++){ if(flag){ sum = i+i; }else{ sum = i+i; } } long timeE1 = System.currentTimeMillis(); long delta1 = timeE1 - timeS1; //这是真实的耗时计算 long realIfElse = delta1-delta; //下面是三目运算符(包含循环和计算)的耗时统计,真实耗时同样应当除去前面的基准值 long timeS2 = System.currentTimeMillis(); for(int i=0; i<max; i++){ sum = flag?i+i:i+i; } long timeE2 = System.currentTimeMillis(); long delta2 = timeE2 - timeS2; //这是真实的耗时计算 long realTri = delta2-delta; //返回耗时比率,以反映效率差别 double f = (double)realIfElse / realTri; return f; } }
结果:
------->min = 1.9841269841269842 ------->max = 3.5161290322580645 ------->ave = 2.6170264636067144
可以看出if else耗时是三目运算符的2.6倍之多!
相关文章推荐
- MyEclipse Spring 学习总结一 Spring IOC容器
- how spring resolves a request
- Java 重写(Override)与重载(Overload)
- JAVA设计模式初探之桥接模式
- Java 继承
- java中将数组、对象、Map、List转换成JSON数据
- java计算时差
- Java泛型:泛型类、泛型接口和泛型方法
- java semaphore 信号量,流控程序
- Spring入门详解
- Java学习笔记struts2篇--通配符
- Java的多态及注意事项
- 给jdk写注释系列之jdk1.6容器(12):PriorityQueue源码解析PriorityQueue是一种什么样的容器呢?看过前面的几个jdk容器分析的话,看到Queue这个单词你一定会,哦~这
- JAVA代码中注释的使用
- java设计模式之责任链模式
- SiteMesh3整合SpringMVC+FreeMarker
- java abstract介绍
- Eclipse调试Android工具集锦之三-ADB
- 归并排序的原理及java代码实现
- Spring MVC Rest 服务 406 错误解决方案