Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 351|回复: 0

[J2ME学习]J2ME中循环与String的优化

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:05:49 | 显示全部楼层 |阅读模式
    循环的最佳化
         通常我们撰写循环时,习惯让计数变量从0 开始,然后累加。但是,只要做一点小小的更改,就可以让程序跑的更快,范例程序如下:
    //PerfTest.java

    1. import javax.microedition.midlet.*;
    2. import javax.microedition.lcdui.*;
    3. public class PerfTest extends MIDlet{
    4.   public PerfTest(){}
    5.   public void startApp(){
    6.    long start,end ;
    7.    start = System.currentTimeMillis() ;
    8.    for(int i=0 ; i < 9000000 ; i++) ;
    9.     end = System.currentTimeMillis() ;
    10.    System.out.println("Normal loop : "+ (end-start) + " milliseconds") ;

    11.    start = System.currentTimeMillis() ;
    12.    for(int i=8999999 ; i >= 0 ; i--) ;
    13.      end = System.currentTimeMillis() ;
    14.    System.out.println("Optimized loop : "+ (end-start) + " milliseconds") ;
    15. }
    16. public void pauseApp(){}
    17. public void destroyApp(boolean unconditional){}
    18. }
    复制代码
    执行结果:
    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)>

    而第二段程序代码被编译成
    56 invokestatic #2 <Method long currentTimeMillis()>
    59 lstore_1
    60 ldc #13 <Integer 8999999>
    62 istore 6
    64 goto 70
    67 iinc 6 -1
    70 iload 6
    72 ifgt 67
    75 invokestatic #2 <Method long currentTimeMillis()>
    78 lstore_3
    79 getstatic #4 <Field java.io.PrintStream out>
    82 new #5 <Class java.lang.StringBuffer>
    85 dup
    86 invokespecial #6 <Method java.lang.StringBuffer()>
    89 ldc #14 <String "Optimized loop : ">
    91 invokevirtual #8 <Method java.lang.StringBuffer append(java.lang.String)>
    94 lload_3
    95 lload_1
    96 lsub
    97 invokevirtual #9 <Method java.lang.StringBuffer append(long)>
    100 ldc #10 <String " milliseconds">
    102 invokevirtual #8 <Method java.lang.StringBuffer append(java.lang.String)>
    105 invokevirtual #11 <Method java.lang.String toString()>
    108 invokevirtual #12 <Method void println(java.lang.String)>

    所以速度加快了。

    String 的最佳化

    通常我们要处理字符串时,第一个想到的就是String 类别,范例如下:

    //StringBufferTest.java
    1. import javax.microedition.midlet.*;
    2. import javax.microedition.lcdui.*;
    3. public class StringBufferTest extends MIDlet{
    4.   public StringBufferTest(){}
    5.   public void startApp(){
    6.    Runtime rt = Runtime.getRuntime() ;
    7.    long diffstart = rt.totalMemory()-rt.freeMemory();
    8.    System.out.println("Memory used Start:" + diffstart) ;
    9.    
    10. //注意,底下的程序代码没有任何意义,纯粹要展示String 有多耗内存
    11.    String sum = "" ;
    12.    for(int i=0 ; i< 5000 ; i++){
    13.      sum = sum + "+" + i ;
    14.     }
    15.    long diffend = rt.totalMemory()-rt.freeMemory();
    16.    System.out.println("Memory used End:" + diffend) ;
    17.    System.out.println("Memory used after operation:" + (diffend-diffstart)) ;
    18.   }
    19.   public void pauseApp(){}
    20.   public void destroyApp(boolean unconditional){}
    21. }
    复制代码
    执行结果:
    Memory used Start:28564
    Memory used End:259864
    Memory used after operation:231300

    在此范例程序中,我们使用Runtime 类别的totoalMemory()来取得系统所有的内存大小,使用freeMemory()来取得可用内存的大小,两者相减之后约略是中间程序代码执行时所占用的内存大小。我们可以发现,循环执行500 次,耗掉了约231300 byte 的内存。如果我们把String 用StringBuffer 来替代:

    //StringBufferTest1.java
    1. import javax.microedition.midlet.*;
    2. import javax.microedition.lcdui.*;
    3. public class StringBufferTest1 extends MIDlet{
    4.   public StringBufferTest1(){}
    5.   public void startApp(){
    6.     Runtime rt = Runtime.getRuntime() ;
    7.     long diffstart = rt.totalMemory()-rt.freeMemory();
    8.     System.out.println("Memory used Start:" + diffstart) ;

    9.    //注意,底下的程序代码没有任何意义,纯粹要展示StringBuffer
    10.     StringBuffer sum = new StringBuffer("");
    11.     for(int i=0 ; i< 5000 ; i++){
    12.       sum = sum.append("+").append(i) ;
    13.     }
    14.    long diffend = rt.totalMemory()-rt.freeMemory();
    15.    System.out.println("Memory used End:" + diffend) ;
    16.    System.out.println("Memory used after operation:" + (diffend-diffstart)) ;
    17.   }
    18.   public void pauseApp(){}
    19.   public void destroyApp(boolean unconditional){}
    20. }
    复制代码
    执行结果:
    Memory used Start:28548
    Memory used End:160848
    Memory used after operation:132300

    我们发现,改用StringBuffer 之后,循环同样执行500 次,,一样效果的程序代码,但内存只耗掉了132300 byte 的内存。少了将近一倍,这告诉我们,虽然StringBuffer 无法完全取代,但是如果可以的话,尽量使用StringBuffer。

    之所以有节省内存的效果,是因为String 对象的设计采用了immutable 这种设计模式(Design Pattern),这是为了安全性的考量.



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://203.93.208.26/kj/cwb/dir7/782774.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:28 , Processed in 0.296532 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表