J2ME循环与String优化设计

通常我们撰写循环时,习惯让计数变量从0 开始,然后累加。但是,只要做一点小小的更改,就可以让程序跑的更快,范例程序如下:

//PerfTest.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class PerfTest extends MIDlet
{
public PerfTest()
{
}
public void startApp()
{
long start,end ;
start = System.currentTimeMillis() ;
for(int i=0 ; i < 9000000 ; i++) ;
end = System.currentTimeMillis() ;
System.out.println("Normal loop : "+ (end-start) + " milliseconds") ;
start = System.currentTimeMillis() ;
for(int i=8999999 ; i >= 0 ; i--) ;
end = System.currentTimeMillis() ;
System.out.println("Optimized loop : "+ (end-start) + " milliseconds") ;
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}

执行结果:

Normal loop : 2046 milliseconds
Optimized loop : 1563 milliseconds

从上述范例我们可以发现,跑900 万次,单单跑循环而以就相差约500 毫秒,将进1/4 的效能提升。

这个范例可以扩大到任何使用到比较运算符(>、>=、<、<=、!=)。之所以会有效能的提升,是因为如果任何数值要与0 比较,在底层都有对应较简单的指令可以对应,也因此加速了程序的执行。范例的第一段程序代码被编译成:

0 invokestatic #2 <Method long currentTimeMillis()>
3 lstore_1
4 iconst_0
5 istore 5
7 goto 13
10 iinc 5 1
13 iload 5
15 ldc #3 <Integer 9000000>
17 if_icmplt 10
20 invokestatic #2 <Method long currentTimeMillis()>
23 lstore_3
24 getstatic #4 <Field java.io.PrintStream out>
27 new #5 <Class java.lang.StringBuffer>
30 dup
31 invokespecial #6 <Method java.lang.StringBuffer()>
34 ldc #7 <String "Normal loop : ">
36 invokevirtual #8 <Method java.lang.StringBuffer append(java.lang.String)>
39 lload_3
40 lload_1
41 lsub
42 invokevirtual #9 <Method java.lang.StringBuffer append(long)>
45 ldc #10 <String " milliseconds">
47 invokevirtual #8 <Method java.lang.StringBuffer append(java.lang.String)>
50 invokevirtual #11 <Method java.lang.String toString()>
53 invokevirtual #12 <Method void println(java.lang.String)>

时间: 2024-12-02 15:29:56

J2ME循环与String优化设计的相关文章

java List循环与Map循环的总结_java

java  List循环与Map循环的总结 做了一下list和map的总结,没有什么技术含量,就全当复习了一下api. 测试环境是在junit4下,如果没有自己写一个main方法也是一样的. 首先是List的三种循环: @Test public void ForListTest() { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list

for循环与for in,$(&#039;&#039;).each 与$.each的区别

一:for循环与for in的区别 for...in 语句用于对数组或者对象的属性进行循环操作. 语法: for (变量 in 对象) {     在此执行代码 } for循环是对数组的元素进行循环,而不能引用于非数组对象(类数组对象也可以遍历). 语法: for(int 变量初始值;条件;递增或递减){     在此执行代码 } 用for in遍历window对象的属性. for(var prop in window){ console.log(winodw[prop ]) }   用for

thinkPHP模板中for循环与switch语句用法示例_php实例

本文实例讲述了thinkPHP模板中for循环与switch语句用法.分享给大家供大家参考,具体如下: 1.for用法 <for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" > </for> 案例 <for start="1" end="100"> {$i}

Android开发笔记之:消息循环与Looper的详解_Android

Understanding LooperLooper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止.通常情况下不会用到Looper,因为对于Activity,Service等系统组件,Frameworks已经为我们初始化好了线程(俗称的UI线程或主线程),在其内含有一个Looper,和由Looper创建的消息队列,所以主线程会一直运行,处理用户事件,直到某些事件(BACK)退出.如果,我们需要新建一个线程,并

Android开发笔记之:消息循环与Looper的详解

Understanding Looper Looper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止.通常情况下不会用到Looper,因为对于Activity,Service等系统组件,Frameworks已经为我们初始化好了线程(俗称的UI线程或主线程),在其内含有一个Looper,和由Looper创建的消息队列,所以主线程会一直运行,处理用户事件,直到某些事件(BACK)退出. 如果,我们需要新建一个线程

js使用for循环与innerHTML获取选中tr下td值

 function getParentEl (el, tagName) { if (!el) return el;    do { el = el.parentNode; } while(el && el.tagName !== tagName);    return el; }    function temp(){ //得到选中row的value值 var temp=document.getElementsByName('id'); for(var i=0;i<temp.leng

一个shell for循环与case结合的脚本(监控程序状态)_linux shell

核心代码: 复制代码 代码如下: #/bin/bashset -xHOSTS="nginx mysql php-cgi"for myhost in $HOSTS  do  count=(`ps aux |grep $myhost |grep -v grep |wc -l`)  echo "$myhost"  echo "$count" if [ $count -eq 0 ]; then  case $myhost in  nginx)   cd

JS数组的遍历方式for循环与for...in_javascript技巧

JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third") for(var i = 0;i < a.length; i++) { document.write(a[i]+","); } 输出的结果:fitst,second,third 第一种:用for...in 这种遍历的方式,例如: var arr = new Array(&

c语言for循环与C#for循环性能对比

问题描述 C语言代码inti=0;for(i=0;i<999000000;++i){} 运行时间花了2秒多一点for(inti=0;i<999000000;i++){} 运行时间花了354毫秒左右.本人预测C语言会比C#的for循环快.怎么会相反呢?而且还远不如C#的for循环.这是为什么,忘各位大师指点迷津 解决方案 解决方案二:因为JIT做过一次循环后发现什么也没做,于是机智的跳过后面的循环直接给i赋值了没开优化的C编译器还是老实巴交的慢慢数不开优化就是耍流氓解决方案三:可是我这样改了,运