- 浏览: 468408 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
代码如下:
/*
* 0.0.0 ~99.9.0
* 执行次数 100*10*1=1000次
* 执行时间 812
*/
public void doThing(){
for(int i = 0;i<10000;i++) {
for(int j = 0;j<1000;j++) {
for(int k = 0;k<100;k++) {
function(i,j,k);
}
}
}
}
/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOpThing(){
for(int i = 0;i<100;i++) {
for(int j = 0;j<1000;j++) {
for(int k = 0;k<10000;k++) {
function(i,j,k);
}
}
}
}
/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOp2Thing(){
int i,j,k;
for(i = 0;i<100;i++) {
for(j = 0;j<1000;j++) {
for(k = 0;k<10000;k++) {
function(i,j,k);
}
}
}
}
其实这道题的目的并不是让你写出优化的方法,而是考你JVM的编译解析原理.
/ Method descriptor #6 ()V
// Stack: 4, Locals: 4
public void doThing();
0 iconst_0 --将int型0推送至栈顶
1 istore_1 [i] --将栈顶int型数值存入第二个本地变量
2 goto 44 --无条件转移
5 iconst_0 --将int型0推送至栈顶
6 istore_2 [j] --将栈顶int型数值存入第三个本地变量
7 goto 34 --无条件转移
10 iconst_0 --将int型0推送至栈顶
11 istore_3 [k] --将栈顶int型数值存入第四个本地变量
12 goto 25 --无条件转移
15 aload_0 [this] --将第一个引用类型本地变量推送至栈顶
16 iload_1 [i] --将第二个int型本地变量推送至栈顶
17 iload_2 [j] --将栈顶int型数值存入第三个本地变量
18 iload_3 [k] --将栈顶int型数值存入第四个本地变量
19 invokevirtual org.yclframework.auth.test.dao.ibatis.Optimize.function(int, int, int) : void [24] –执行方法
[以上执行过程都是一致的,两个方法]
22 iinc 3 1 [k] --将指定int型变量增加指定值,这里是++
25 iload_3 [k] --将第四个int型本地变量推送至栈顶
26 bipush 100 --将单字节的常量值(-128~127)推送至栈顶
28 if_icmplt 15 --比较栈顶两int型数值大小,当结果小于0时跳转
31 iinc 2 1 [j] --将指定int型变量增加指定值,这里是++
34 iload_2 [j] --将栈顶int型数值存入第三个本地变量
35 sipush 1000 --将一个短整型常量值(-32768~32767)推送至栈顶
38 if_icmplt 10 --比较栈顶两int型数值大小,当结果小于0时跳转
41 iinc 1 1 [i] --将指定int型变量增加指定值,这里是++
44 iload_1 [i] --将栈顶int型数值存入第二个本地变量
45 sipush 10000 --将一个短整型常量值(-32768~32767)推送至栈顶
48 if_icmplt 5 --比较栈顶两int型数值大小,当结果小于0时跳转
51 return --方法返回
Line numbers:
[pc: 0, line: 17]
[pc: 5, line: 18]
[pc: 10, line: 19]
[pc: 15, line: 20]
[pc: 22, line: 19]
[pc: 31, line: 18]
[pc: 41, line: 17]
[pc: 51, line: 24]
Local variable table:
[pc: 0, pc: 52] local: this index: 0 type: org.yclframework.auth.test.dao.ibatis.Optimize
[pc: 2, pc: 51] local: i index: 1 type: int
[pc: 7, pc: 41] local: j index: 2 type: int
[pc: 12, pc: 31] local: k index: 3 type: int
编译成Calss的doThing(),其与doOpThing()唯一不同的是执行顺序,其执行顺序如下:
22 iinc 3 1 [k]
25 iload_3 [k]
26 sipush 10000
29 if_icmplt 15
32 iinc 2 1 [j]
35 iload_2 [j]
36 sipush 1000
39 if_icmplt 10
42 iinc 1 1 [i]
45 iload_1 [i]
46 bipush 100
48 if_icmplt 5
51 return
doOpThing()与doOp2Thing()的执行顺序一模一样.
在出入栈操作中,doThing出入栈如下:
变量 出入栈次数 /比较次数
K 100*1000*10000
J 1000*10000
I 10000
在出入栈操作中,doOpThing的出入栈如下:
变量 出入栈次数 /比较次数
K 10000*1000*100
J 1000*100
I 100
其实For循环里面使用的都是局部变量,其变量采用的是本地变量,只初始化一次
接下来都是出入栈和比较的操作,大家可以看到出入栈和比较次数都是相当快的.
采用优化策略却在时间上却提升了10%,虽然是毫妙级别的,但是如果function是一个执行时间很长的程序,那么程序的提升将会很大.
有的时候必须同步执行,业务逻辑控制的,只能顺序执行.
如果可以多线程执行,当然不会用for循环
/*
* 0.0.0 ~99.9.0
* 执行次数 100*10*1=1000次
* 执行时间 812
*/
public void doThing(){
for(int i = 0;i<10000;i++) {
for(int j = 0;j<1000;j++) {
for(int k = 0;k<100;k++) {
function(i,j,k);
}
}
}
}
/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOpThing(){
for(int i = 0;i<100;i++) {
for(int j = 0;j<1000;j++) {
for(int k = 0;k<10000;k++) {
function(i,j,k);
}
}
}
}
/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOp2Thing(){
int i,j,k;
for(i = 0;i<100;i++) {
for(j = 0;j<1000;j++) {
for(k = 0;k<10000;k++) {
function(i,j,k);
}
}
}
}
其实这道题的目的并不是让你写出优化的方法,而是考你JVM的编译解析原理.
/ Method descriptor #6 ()V
// Stack: 4, Locals: 4
public void doThing();
0 iconst_0 --将int型0推送至栈顶
1 istore_1 [i] --将栈顶int型数值存入第二个本地变量
2 goto 44 --无条件转移
5 iconst_0 --将int型0推送至栈顶
6 istore_2 [j] --将栈顶int型数值存入第三个本地变量
7 goto 34 --无条件转移
10 iconst_0 --将int型0推送至栈顶
11 istore_3 [k] --将栈顶int型数值存入第四个本地变量
12 goto 25 --无条件转移
15 aload_0 [this] --将第一个引用类型本地变量推送至栈顶
16 iload_1 [i] --将第二个int型本地变量推送至栈顶
17 iload_2 [j] --将栈顶int型数值存入第三个本地变量
18 iload_3 [k] --将栈顶int型数值存入第四个本地变量
19 invokevirtual org.yclframework.auth.test.dao.ibatis.Optimize.function(int, int, int) : void [24] –执行方法
[以上执行过程都是一致的,两个方法]
22 iinc 3 1 [k] --将指定int型变量增加指定值,这里是++
25 iload_3 [k] --将第四个int型本地变量推送至栈顶
26 bipush 100 --将单字节的常量值(-128~127)推送至栈顶
28 if_icmplt 15 --比较栈顶两int型数值大小,当结果小于0时跳转
31 iinc 2 1 [j] --将指定int型变量增加指定值,这里是++
34 iload_2 [j] --将栈顶int型数值存入第三个本地变量
35 sipush 1000 --将一个短整型常量值(-32768~32767)推送至栈顶
38 if_icmplt 10 --比较栈顶两int型数值大小,当结果小于0时跳转
41 iinc 1 1 [i] --将指定int型变量增加指定值,这里是++
44 iload_1 [i] --将栈顶int型数值存入第二个本地变量
45 sipush 10000 --将一个短整型常量值(-32768~32767)推送至栈顶
48 if_icmplt 5 --比较栈顶两int型数值大小,当结果小于0时跳转
51 return --方法返回
Line numbers:
[pc: 0, line: 17]
[pc: 5, line: 18]
[pc: 10, line: 19]
[pc: 15, line: 20]
[pc: 22, line: 19]
[pc: 31, line: 18]
[pc: 41, line: 17]
[pc: 51, line: 24]
Local variable table:
[pc: 0, pc: 52] local: this index: 0 type: org.yclframework.auth.test.dao.ibatis.Optimize
[pc: 2, pc: 51] local: i index: 1 type: int
[pc: 7, pc: 41] local: j index: 2 type: int
[pc: 12, pc: 31] local: k index: 3 type: int
编译成Calss的doThing(),其与doOpThing()唯一不同的是执行顺序,其执行顺序如下:
22 iinc 3 1 [k]
25 iload_3 [k]
26 sipush 10000
29 if_icmplt 15
32 iinc 2 1 [j]
35 iload_2 [j]
36 sipush 1000
39 if_icmplt 10
42 iinc 1 1 [i]
45 iload_1 [i]
46 bipush 100
48 if_icmplt 5
51 return
doOpThing()与doOp2Thing()的执行顺序一模一样.
在出入栈操作中,doThing出入栈如下:
变量 出入栈次数 /比较次数
K 100*1000*10000
J 1000*10000
I 10000
在出入栈操作中,doOpThing的出入栈如下:
变量 出入栈次数 /比较次数
K 10000*1000*100
J 1000*100
I 100
其实For循环里面使用的都是局部变量,其变量采用的是本地变量,只初始化一次
接下来都是出入栈和比较的操作,大家可以看到出入栈和比较次数都是相当快的.
采用优化策略却在时间上却提升了10%,虽然是毫妙级别的,但是如果function是一个执行时间很长的程序,那么程序的提升将会很大.
评论
3 楼
lidong2410
2014-02-21
不考虑内存的话,一层循环快多了。
2 楼
a123159521
2011-04-01
freish 写道
“如果function是一个执行时间很长的程序,那么程序的提升将会很大”,这个逻辑,真是不敢恭维,函数的执行时间越长,越体现不出循环“优化”带来的的效果才是
有的时候必须同步执行,业务逻辑控制的,只能顺序执行.
如果可以多线程执行,当然不会用for循环
1 楼
freish
2011-03-19
“如果function是一个执行时间很长的程序,那么程序的提升将会很大”,这个逻辑,真是不敢恭维,函数的执行时间越长,越体现不出循环“优化”带来的的效果才是
发表评论
-
Java Application Cache
2016-09-27 19:25 884Application Cache is used very ... -
Java 字符串分词
2015-01-02 14:43 1749在Java的世界里有个类型 ... -
jdk 1.6 新特性,集成Groovy, 性能很差
2014-04-02 14:27 1276性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主 ... -
Fake Code easy implements
2014-04-01 15:41 1027package org.miniframe.modules ... -
JDK regex 用法及用途
2014-03-31 15:48 1215查找 Boolean flag = pattern.mat ... -
生产者消费者(四)
2014-03-04 12:32 1148需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(三)
2014-03-04 10:59 961需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(二)
2014-03-03 15:40 695需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者模式(一)
2014-02-28 14:30 1031需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
查看Class文件使用的JDK版本
2013-10-30 14:17 1115由于JDK一般是向下兼容的,所以有时候本地的JDK版本比类库的 ... -
Java源代码转码
2012-12-20 17:22 1323现在中国的项目很多,编码无非是UTF-8,GBK,GB2312 ... -
Tomcat集成OSGI,并通过JNDI开放Web调用
2012-12-03 11:22 3135Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用 ... -
JDK的Logging
2012-11-07 15:49 1683jdk自带有一个log日志,对于一般的使用,仅够了. 代码如下 ... -
java.util.*
2012-11-06 14:23 1377java.util 工具包,灰常的有用,有机会一定要研读源码。 ... -
java.util.concurrent.*
2012-11-02 10:38 17761. java.util.concurrent.ArrayBl ... -
java.util.rt.*
2012-10-31 13:51 11131. java.util.HashMap 散列表,主要是以离散 ... -
巧秒设计方法,不返回null
2016-09-27 19:32 723/** * {@inheritDoc} * ... -
java doc 代码文档
2012-07-13 13:58 1330对于代码规范不解释了,网上很多。 在编写代码的时候,有一点灰 ... -
接口与抽象类
2012-07-11 16:53 11241. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
JVM优化机制好诡异
2012-04-20 08:43 1466long i[] = new long[1000000]; ...
相关推荐
1. 嵌套循环优化 在Java中,嵌套循环是一种常见的循环结构。但是,如果我们不合理地使用嵌套循环,可能会给程序的性能带来很大的影响。解决方法是遵循“外小内大”的原则,即将小循环放在大循环的内部。这可以显著...
### 多重For循环优化分析 #### 原始代码分析 原始代码示例如下: ```java for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { for(int k = 0; k ; k++) { log(i * j * k); } } } ``` 此段代码中的嵌套循环...
本文将深入探讨Java中的循环技巧,特别是如何利用不同类型的循环控制语句来优化程序性能,提高代码可读性和可维护性。 #### 一、基本循环结构 Java提供了三种基本的循环结构:`for`、`while` 和 `do-while` 循环。...
在“7多重循环.zip”这个文件中,我们可以推测它可能包含了一些关于多层循环,即嵌套循环的示例或教程。下面我们将深入探讨多重循环的概念、应用场景以及如何在不同编程语言中实现。 多重循环,顾名思义,是指在...
在Java的学习过程中,掌握基础语法是至关重要的,其中“语句”是构成程序的基本单元,而“For循环嵌套”则是Java中一种高效控制流程的方法。 在Java中,For循环是一种预定义结构,常用于迭代执行一段代码块,直到...
在多重循环中,将最长的循环置于最内层,最短的循环置于最外层,可以减少循环嵌套的复杂度,提高执行效率。 #### 十二、线程安全与集合优化 - **线程安全**:使用`synchronizedList`确保线程安全。 - **预设...
在编程领域,多重循环是一种常见的控制流结构,用于在程序中执行重复操作。这个"教学案例六 多重循环.zip"文件很可能包含了多个示例,旨在帮助学习者理解和掌握如何在不同的编程语言中使用多重循环。下面我们将深入...
五、循环优化 在编写循环时,应考虑其效率,避免不必要的计算。例如,如果循环体内有相同的操作,可以先计算结果,然后在循环中使用。另外,合理使用集合类(如ArrayList、LinkedList)的迭代器也可以提高效率。 ...
在循环嵌套中,这些循环结构可以相互结合,形成多层循环,每层循环都有自己的控制条件。 嵌套循环的一个经典例子是计算特定范围内数字的特定属性。比如,在描述中提到的案例,计算1到100所有奇数的和,我们可以使用...
#### 循环优化 1. **避免在循环中重复计算:** 在循环体内重复计算相同值会降低效率。例如,`for(int i = 0; i (); i++) {}`中,`collection.size()`每次循环都会被调用,造成不必要的计算开销。优化方法是将其结果...
除了基本的导出功能,还可以进一步优化Excel的样式,比如设置单元格的字体、颜色、对齐方式,以及合并单元格等。此外,Apache POI还支持模板导出Excel,即预先定义好Excel模板,然后填充数据,这种方式在生成复杂...
4. **跳出多重嵌套循环**:可以使用`break`语句跳出当前的多重嵌套循环,但无法直接跳出外层循环,需配合标签(label)使用。 5. **switch语句的使用**:switch语句可以作用在byte、char、short和int类型上,JDK 7...
- **性能优化**:虽然Java在某些方面可能不如Cobol效率高,但可以通过优化算法和利用Java的并发特性来提升性能。 - **培训和支持**:团队成员可能需要学习新的编程语言和工具,提供必要的培训和支持至关重要。 总的...
4. Java中多重循环的跳出: 在Java中,如果需要跳出多重嵌套的循环,可以使用带标签的break语句。在循环体外部定义一个标签,然后在内层循环体中使用break语句后跟这个标签来跳出外层循环。例如,可以定义一个标签...
- **高性能**:虽然Java是一种解释性语言,但其性能优化技术使其接近于编译型语言。 - **简单性**:Java语言设计简洁明了,易于学习和使用。 - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。...
在处理多层逻辑或遍历复杂数据结构时,循环嵌套尤其有用。本案例将探讨如何在不同的编程语言中使用循环嵌套,以及它在实际问题解决中的应用。 一、循环类型与嵌套原理 在编程中,主要存在两种类型的循环:`for`...
1. Java程序性能优化通常包括减少不必要的对象创建、循环展开、使用局部变量等。 2. 编码规范的遵守有利于提高代码的可读性和可维护性。 Java框架知识点: 1. Spring AOP(面向切面编程)可以将横切关注点与业务...
6. 跳出多重嵌套循环的方法:在Java中,可以使用标签(label)配合break语句来跳出多层循环。 7. hashCode的特性:当两个对象通过equals方法比较返回true时,并不意味着它们的hashCode值一定相同,这是由于Java...
1. **Java语言基础**:书中详细讲解了Java的基本语法,包括变量、数据类型、运算符、流程控制(如if语句、for循环、while循环)、函数定义和调用等,这些都是编写任何程序的基础。 2. **面向对象编程**:《Thinking...