冷面阎罗

低调做人&&高调做事
随笔 - 208, 文章 - 3, 评论 - 593, 引用 - 0
数据加载中……

【再次讨论】【转】Java程序性能和速度优化实例

例一:应用具有I/O Buffer功能Class

  import java.io.*;
  public class IoTest
  {
   public static void main(String args[])
   {
    try
    {
     FileReader fr = new FileReader(args[0]);
     BufferedReader br = new BufferedReader(fr);
     while ( br.readLine() != null )
     {
      System.out.println(" The file content are :" + br.readLine());
     }
     fis.close();
    }
    catch ( IOException ioe )
    {
     System.out.println("The I/O exception is " + ioe);
    }
   }
  }
   
  在上例中,程序使用了具有Buffer功能的Class,使得Disk I/O的读取速度大大提高。BufferedReader 是取代DataInputStream 而提高读写速度的Java Class。在新的Java版本中,已不建议使用DataInputStream,因为其读写是基于字符为单位的。
   
  例二:字符串运算处理
   
  public class StringOperation
  {
   public static void main(String args[])
   {
    String sqlQuery = null;
    String sqlCondition = " conditionC = conditionD ");
    StringBuffer sb = new StringBuffer();
    sb.append("select * from database table where ");
    sb.append(" conditionA = conditionB and ");
    if ( ! sqlCondition.equals(null)
    {
     sb.append(sqlCondition);
    }
    else
    {
     sb.append(" conditionE = conditionF ");
    }
    sqlQuery = sb.toString();
    // Then connect to the database then excute the database query
    // .......
   }
  }
   
  在上例中,使用StingBuffer class来完成数据库查询建立,避免使用String class的"+="操作,以减少JVM在内存中创建新的对象,占用资源,增加JVM回收资源负担。读者可以使用Java Proflier功能来具体比较使用不同的String操作,JVM需要完成多少资源回收和运行时间。因此在JVM中对String直接进行"+="是非常昂贵的运算。

  例三:处理昂贵的数据库初始化

  目前许多网站可以透过Web服务器查询数据库,如何提高数据库查询速度成为许多程序员关注的问题。在Java Servlets或JSP中可以通过init() 或Jspinit()来实现,以下是一具体Java Servlet与数据库对话实例。
    
  import java.io.*;
  import java.sql.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
   
  public class DatabaseServlet extends HttpServlet
  {
   public void init( ServletConfig conf) throws ServletException
   {
    super.init(conf);
    Connection conn = null;
    try
    {
     Class.forName("sun.jdbc.odbc.JdcOdbcDriver");
     Conn = DriverManager.getConnection("jdbc:odbc:yourDSN,"","");
    }
    catch ( SQLException sqle )
    {
     System.err.println("your error exception is " + sqle);
    }
    catch ( ClassNotFoundException cnfe )
    {
     System.err.println("your error exception is " + cnfe);
    }
   }
   public void doGet( HttpServletRequest req, HttpServletResponse res) throws
   ServletException, IOException
   {
    res.setContentType("text/html");
    ServletOutputStream out = null;
    // Your HTML formatter
    out.println(" Your HTML");
    try
    {
     Statement stmt = conn.creatStatement();
     ResultSet rs = stmt.excuteQuery("select * from yourDatabasetable ");
     while ( rs.next() )
     {
      // Processing your data
     }
    }
    catch ( SQLException sqle )
    {
     out.println("The SQL error is " + sqle);
    }
    // output your processing result to HTML page
    out.println(" your HTML");
    rs.close();
    stmt.close();
   }
   public void destroy()
   {
    try
    {
     conn.close();
    }
    catch ( SQLException sqle )
    {
     System.err.println("your SQL error is " + sqle);
    }
   }
  }
   
  在上例中,由于Java Servlet运行机制的特点,将昂贵的数据库初始化运算在整个Servlet运行中仅只调用一次的init()中完成,以减少不必要的重复性数据库运算。读者可以根据应用的具体情况,甚至将数据库的Statement和ResultSet部分移至init()中完成,或者调用PreparedStatement与CallableStatement来优化数据库的运算。同时,对数据库的连接的关闭由destroy()一次性完成

posted on 2007-04-04 10:56 冷面阎罗 阅读(3280) 评论(19)  编辑  收藏 所属分类: java

评论

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

在类型转换时,使用parse×××而不要使用valueOf也能使速度有微小的提升。
2007-04-04 12:16 | 嘎嘎

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

对第二条不能苟同,请见
http://junglesong.yculblog.com/post.2697595.html.

2007-04-04 14:02 | junglesong的博客

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

其实这个string和stringbuffer之间的讨论,到底谁好谁不好,一直争下去。我个人的观点
一、考虑是动态的还是静态,什么意思呢?就是我拼的东西是在编译时还是运行时执行。
二、代码的合理、可读等
三、如果性能差不多时,我感觉完全时可以相互替代的。

这么说吧:你不论在什么都用string,错不错?错了没有?不错,我可以实现功能了对吧,那么我要作的更高级的是代码的优化。

即首先是完成功能然后才是代码的优化。
2007-04-04 14:46 | 冷面阎罗

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

恩,果然经验之谈
2007-04-04 14:46 | fantasista

# re: 【再次讨论】【转】Java程序性能和速度优化实例[未登录]  回复  更多评论   

第三条,至少搞个数据库连接池吧,岂不是更好?
2007-04-04 17:08 | soleghost

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

第三条,在现实编程中,这种情况,肯定是不会出现的。
2007-04-04 17:22 | 冷面阎罗

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

编译期是“+”快,运行期是“append()”快
2007-04-04 17:24 | yuri

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

没测试过
2007-04-04 18:21 | liulc

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

第三条你的意思我明白,就是服务器启动时就建立一个Connection,那可以自己编写一个连接池,启动的时候建立比如20个连接,我们就这样做的。那样应该更好吧:)
2007-04-05 07:56 | chorsg

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

其实有关代码的优化,每个人都有自己的心得,我只是把自己的一点想法说出来,具体做法因地制宜。
2007-04-09 16:04 | 冷面阎罗

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

还用StingBuffer,还是用StringBuilder吧
2007-04-10 08:56 | zdbjava

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

java类库设计师之一说,String +连接 的性能消耗与StringBuffer 相比,倍数以2的n次冥递增,n为连接字符串的数量,建议尽量使用StringBuffer。
对于http://junglesong.yculblog.com/post.2697595.html. 里所说的,我不能苟同。所谓小事不为,何以为大事。用不用StringBuffer不应该是优化的一个步骤,而应该是良好编码习惯的一种体现。使用StringBuffer并不会怎么降低程序的可读性,只要你稍稍适应一下。如果你是做信息化的,比如oa什么的,你完全可以忽略这些细节,只管数据库性能就够了,但是如果是做公共网站的,那你死定了
2007-04-10 13:04 | hs

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

这样就性能优化了吗?
2007-04-10 15:34 | lancey

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

这样就性能优化了吗
2007-04-10 15:35 | lancey

# re: 【再次讨论】【转】Java程序性能和速度优化实例[未登录]  回复  更多评论   

天啦,这个都可以上头版,太水了吧?
2007-04-11 13:42 | java fans

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

在JAVA JDK高版本里其实还用StingBuffer,和+连接是差不多的吧?因为JAVA在你用+的时候,是会转换为StingBuffer执行的,呵呵。。其实要看习惯了,习惯怎么用就怎么用
2007-04-12 08:26 | kk

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

To hs:

>>java类库设计师之一说,String +连接 的性能消耗与StringBuffer 相比,倍数以2的n次冥递增,n为连接字符串的数量,建议尽量使用StringBuffer。

出处在那,证据呢?

>>用StringBuffer不应该是优化的一个步骤,而应该是良好编码习惯的一种体现

笑话!这句话是你自己定义的吧.

下面是我的完整结论,希望你不要钻牛角尖.
1.如果在我们常用的SQL拼句,Msg连接,HTML输出使用StringBuffer取代String,无端增加了一个类,降低了程序可读性,增加了代码臭味.
2.以上的常见应用中,改String为StringBuffer带来的利益小到可忽略不计的程度,完全抵消不了程序可读性的降低带来的劣势.
3.字符串拚接往往不是系统的瓶颈,做系统优化时应该先确定那里关键的制约部分再进行优化,80%的性能问题都是因20%的代码引起,所以不要盲目上马,劳而无功.
4.从大势来看,通用场合String取代StringBuffer不可避免.StringBuffer应该少用或不用.
5.与其关注小小的字符串,还不如去分析以下Cache和Pool的处理.舍小道而奔大道.




2007-04-19 00:56 | junglesong

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

>>如果你是做信息化的,比如oa什么的,你完全可以忽略这些细节,只管数据库性能就够了,但是如果是做公共网站的,那你死定了.

你还停留在拿字符串拼SQL的时代吧,知道OR Mapping的出现和动机吗?知道现代网站是在刻意避免拼复杂的SQL语句吗? 不知道你死定了.


2007-04-19 01:03 | junglesong

# re: 【再次讨论】【转】Java程序性能和速度优化实例  回复  更多评论   

大家写个100000次的循环,

比较一下string和stringbuffer就知道谁快了。。

stringbuffer比string可不是快一星半点。。。

java5里面新来了stringbuilder, 还没用过。。。
2007-04-27 10:59 | ddd

只有注册用户登录后才能发表评论。


网站导航: