论坛首页 入门技术论坛

这个循环太让人郁闷了

浏览 12376 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-04-02   最后修改:2009-04-02
今天做了一个关于Webservice的测试,测试的目的是向服务器获取1W条用户信息(XML格式),本来打算做1W、5W、10W条的测试,但是在1W条的时候就卡住了。生成数据竟然用了将近半个小时,郁闷!大家帮看一下啊!
不过也好,也暴露了一些问题,比如:Webservice超时、海量数据(XML)的解析
package cn.com.javaeye;

import java.util.Date;

/**
 * <br>
 *文件名:Test.java<br>
 *@author dongliwei<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Apr 2, 2009 6:16:34 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		long begin = new Date().getTime();
		String xml = getXML(1);
		long end = new Date().getTime();
		System.out.println("生成数据共耗时:" + (end-begin) + "毫秒");
	}

	/**
	 * 获取用户
	 * @param count 单位:万
	 * @return
	 */
	public  static String getXML(int count){
		count = count*10000;
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			   +"<users>";
		for(int  i = 0 ; i < count;i++){
			xml += 	"<user>"
						+"<id>001</id>"
						+"<name>zhangsan</name>"
						+"<empno>086001</empno>"
						+"<password>123456</password>"
						+"<mail>zhangsan@sina.com</mail>"
						+"<mobile>13733027580</mobile>"
						+"<address>北京市海淀区</address>"
						+"<sex>男</sex>"
						+"<organise>012</organise>"
						+"<role>1,2,3</role>"
						+"<group>1,5</group>"
					+"</user>";
			//System.out.println("生成" + (i+1) + "条数据");
		}
		xml += "</users>";
		return xml;
	}
}

经metadmin的指点,使用StringBuffer,就是不一样啊,仅仅用了239毫秒,在此谢过了!下面是修改过的代码
package cn.com.javaeye;

import java.util.Date;

/**
 * <br>
 *文件名:Test.java<br>
 *@author dongliwei<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Apr 2, 2009 6:16:34 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		long begin = new Date().getTime();
		String xml = getXML(1);
		long end = new Date().getTime();
		System.out.println("生成数据共耗时:" + (end-begin) + "毫秒");
	}

	/**
	 * 获取用户
	 * @param count 单位:万
	 * @return
	 */
	public  static String getXML(int count){
		count = count*10000;
		StringBuffer xml = new StringBuffer();
		
		xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		xml.append("<users>");
		for(int  i = 0 ; i < count;i++){
			xml.append("<user>");
			xml.append("<id>001</id>");
			xml.append("<name>zhangsan</name>");
			xml.append("<empno>086001</empno>");
			xml.append("<password>123456</password>");
			xml.append("<mail>zhangsan@sina.com</mail>");
			xml.append("<mobile>13733027580</mobile>");
			xml.append("<address>北京市海淀区</address>");
			xml.append("<sex>男</sex>");
			xml.append("<organise>012</organise>");
			xml.append("<role>1,2,3</role>");
			xml.append("<group>1,5</group>");
			xml.append("</user>");
			System.out.println("生成" + (i+1) + "条数据");
		}
		xml.append("</users>");
		return xml.toString();
	}
}
   发表时间:2009-04-02   最后修改:2009-04-03
这么多字符串拼接,使用StringBuffer

0 请登录后投票
   发表时间:2009-04-02  
metadmin 写道
这么多字符串拼接,使用StringBuffer


-----------------------
权限管理圈子欢迎您加入:
http://accessmanager.group.iteye.com/

谢谢哈,我咋忘了这个啊。呵呵!万分感激!
0 请登录后投票
   发表时间:2009-04-02  
Webservice 1W5W LZ你太NB了 建议你分包或者限制条数吧
0 请登录后投票
   发表时间:2009-04-02  
放在循环里,编译器能优化吗
0 请登录后投票
   发表时间:2009-04-02  
改成StringBuilder再试试,如果你的JDK版本是5.0以上的话...
0 请登录后投票
   发表时间:2009-04-02  
有人已经说了,

webservice要避免大数据量应用,这才是正道,

你再优化也是有一个打包过程的,
0 请登录后投票
   发表时间:2009-04-02   最后修改:2009-04-02
dongliwei122 写道
xml += 	"<user>"
      +"<id>001</id>"
      +"<name>zhangsan</name>"
      +"<empno>086001</empno>"
      +"<password>123456</password>"
      +"<mail>zhangsan@sina.com</mail>"
      +"<mobile>13733027580</mobile>"
      +"<address>北京市海淀区</address>"
      +"<sex>男</sex>"
      +"<organise>012</organise>"
      +"<role>1,2,3</role>"
      +"<group>1,5</group>"
    +"</user>";

其实测试用的这部分代码只是坏在+=那里而已。要知道Java里相邻的两个字符串字面量如果是用+来连接的话,编译结束后就变成一个字符串常量了。例如
"a" + "b"


"ab"

等价。

另外,同上,Java 5或以上的话请用StringBuilder。
0 请登录后投票
   发表时间:2009-04-02  
RednaxelaFX 写道
dongliwei122 写道
xml += 	"<user>"
      +"<id>001</id>"
      +"<name>zhangsan</name>"
      +"<empno>086001</empno>"
      +"<password>123456</password>"
      +"<mail>zhangsan@sina.com</mail>"
      +"<mobile>13733027580</mobile>"
      +"<address>北京市海淀区</address>"
      +"<sex>男</sex>"
      +"<organise>012</organise>"
      +"<role>1,2,3</role>"
      +"<group>1,5</group>"
    +"</user>";

其实测试用的这部分代码只是坏在+=那里而已。要知道Java里相邻的两个字符串字面量如果是用+来连接的话,编译结束后就变成一个字符串常量了。例如
"a" + "b"


"ab"

等价。

另外,同上,Java 5或以上的话请用StringBuilder。

这个循环说:这个程序员太让我郁闷了。
0 请登录后投票
   发表时间:2009-04-02  
<user>...</user>  这在编译的时候会被优化成一个String了,不会使用+算法。
而是xml+= 这个算法,进行了1w次加算法。

所以楼主后来改用了StringBuffer。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics