论坛首页 Java企业应用论坛

关于性能优化

浏览 40014 次
精华帖 (2) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-11-18  
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

有些人习惯性的爱写内存泄漏的代码
真不知道怎么想的


我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试?

新手都未必知道什么是内存泄露。对于java,新手写一段内存泄漏的代码还真不好写。
0 请登录后投票
   发表时间:2010-11-18  
过早进行代码优化是万恶之源
0 请登录后投票
   发表时间:2010-11-18  
qdexception 写道
ouchxp 写道
新手避免性能问题,就让他按规范操作就可以.(不许循环里调用数据库....XXXX)


俺是新手,想问一下,如果不在循环里调用数据库,一般都是用什么解决方案?

俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。

像这样的需求应该怎么实现?

先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗?

俺做逻辑判断所需要的数据挺多的,例如要先查A表,再查B表,再查C表,再查D表,而A,B,C,D表都超过百万甚至上千万数据。

像这种情况一般都怎么解决呢?望指教!


密集表查询比较适合用pl/sql来解决。
0 请登录后投票
   发表时间:2010-11-18  
ouchxp 写道
bitray 写道
赞成2楼和三楼的观点。虽然可能平时大家注意的并不是真正的性能瓶颈。但是如果不重视自己代码的书写规范和简洁,那么写出来的代码就是隐藏的瓶颈,是你最后很难优化出来的东西。有习惯的程序员用stringbuffer和stringbuilder,但是如果是不重视,就会有人用+连接,在多处,一定数据量的情况下,都可能产生隐含问题等


JDK自己已经有优化了. 不合理的优化反而会降低效率
比如字符串常量拼接
String str ="aaa" + "bbb" +"ccc" + "ddd";

StringBuilder sb = new StringBuilder();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
String str = sb.toString();

哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反.
反编译看一下就知道为什么了.


最近发现项目里两个字符串拼接,也用StringBuilder,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的
0 请登录后投票
   发表时间:2010-11-18  
hlylove 写道
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

有些人习惯性的爱写内存泄漏的代码
真不知道怎么想的


我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试?

新手都未必知道什么是内存泄露。对于java,新手写一段内存泄漏的代码还真不好写。


用长生命周期对象,引用短生命周期对象,就行了吧!
0 请登录后投票
   发表时间:2010-11-18  
darrendu 写道
ouchxp 写道
bitray 写道
赞成2楼和三楼的观点。虽然可能平时大家注意的并不是真正的性能瓶颈。但是如果不重视自己代码的书写规范和简洁,那么写出来的代码就是隐藏的瓶颈,是你最后很难优化出来的东西。有习惯的程序员用stringbuffer和stringbuilder,但是如果是不重视,就会有人用+连接,在多处,一定数据量的情况下,都可能产生隐含问题等


JDK自己已经有优化了. 不合理的优化反而会降低效率
比如字符串常量拼接
String str ="aaa" + "bbb" +"ccc" + "ddd";

StringBuilder sb = new StringBuilder();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
String str = sb.toString();

哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反.
反编译看一下就知道为什么了.


最近发现项目里两个字符串拼接,也用StringBuilder,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的


一般只要不是在循环里,用什么都无所谓。喜欢用哪个就用哪个。
0 请登录后投票
   发表时间:2010-11-18  
ironsabre 写道
ouchxp 写道
dsjt 写道
ouchxp 写道

JDK自己已经有优化了. 不合理的优化反而会降低效率
比如字符串常量拼接
String str ="aaa" + "bbb" +"ccc" + "ddd";

StringBuilder sb = new StringBuilder();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
String str = sb.toString();

哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反.
反编译看一下就知道为什么了.


我们项目经理不让用第一种

如果你们的JDK版本在1.4或以下的话还说得过去.
如果是1.5或以上.
你完全可以和他提出来.你写一段测试代码给他看.执行效率有很明显的对比
反编译Class给他看.JDK已经做好优化了.自己的优化不仅多余,反而降低了执行效率


你试试我这段,再想想清楚。。
testString cost =453 mils
testStringBuilder cost =0 mils

public static void main(String[] args) {
long t1 = System.currentTimeMillis();
String str1 = "";
for (int i = 0; i < 20000; i++) {
str1 = str1 + "a";
}
long t2 = System.currentTimeMillis();
System.out.println("testString cost =" + (t2 - t1) + " mils");

long t3 = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 20000; i++) {
sb.append("a");
}
long t4 = System.currentTimeMillis();
System.out.println("testStringBuilder cost =" + (t4 - t3) + " mils");

}



你的例子跟ouchxp的是两种场景,
一个是连加(纯粹的+),一个是多次加(+=操作),
两种不一样的,需要用到+=操作的还是 StringBuffer、StringBuilder 效率高
0 请登录后投票
   发表时间:2010-11-18   最后修改:2010-11-18
qianhd 写道
li445970924 写道
求一段内存泄露的代码


你的代码中肯定有 只是你没发觉而已 或者你代码的对象的生命周期就是那么长
释放不掉的内存就算是内存泄漏
就算是C++ 没有free的内存 在进程结束的时候也会被释放
并不是说 一个map中垃圾数据 你可以通过remove来释放 就不算内存泄漏
一个程序 持续的运行 使用内存不断变大 对象不断增多 肯定是在泄漏

最常见的就是新增需求后 需要观察者模式 然后就简单的增加一个对象加入到listener中 但却不想想什么时候remove




这是让我觉得极品的代码之一
我非常想知道这人写的时候是怎么想的





请教,图片中的代码极品在何处??
是把list 放 map 里么 ? 还是frame==null 的位置不恰当?
0 请登录后投票
   发表时间:2010-11-18   最后修改:2010-11-18
dsjt 写道
qianhd 写道
li445970924 写道
求一段内存泄露的代码


你的代码中肯定有 只是你没发觉而已 或者你代码的对象的生命周期就是那么长
释放不掉的内存就算是内存泄漏
就算是C++ 没有free的内存 在进程结束的时候也会被释放
并不是说 一个map中垃圾数据 你可以通过remove来释放 就不算内存泄漏
一个程序 持续的运行 使用内存不断变大 对象不断增多 肯定是在泄漏

最常见的就是新增需求后 需要观察者模式 然后就简单的增加一个对象加入到listener中 但却不想想什么时候remove




这是让我觉得极品的代码之一
我非常想知道这人写的时候是怎么想的





请教,图片中的代码极品在何处??
是把list 放 map 里么 ? 还是frame==null 的位置不恰当?

应该不是,恐怕他认为返回一个map的list的一成员的引用出去是不妥当。
不过我觉得这个要看业务逻辑,就一段代码片段说明不了什么。
0 请登录后投票
   发表时间:2010-11-18  
抛出异常的爱 写道
ouchxp 写道
蔡华江 写道

这个测试用例是错误的,因为String a = "a"+"a"就是String a = "aa";
但是String a = b + c 就不一样了。

ouchxp 写道

JDK自己已经有优化了. 不合理的优化反而会降低效率
比如字符串常量拼接

我说明了是字符串常量拼接.请看清楚再回答
aladdin181 写道
千万别用 "AAAA"+"BBBB"这样的东西来验证它的性能,那是最不能看出结果的。

恰恰是项目中有很多诸如此类的字符串常量拼接代码.
StringBuilder sql = new StringBuilder();
sql.append(" select a.col1,a.col2,a.col3 ");
sql.append(" from tablea a ,tableb b ");
sql.append(" where a.col1 = b.col1 ");


字符串常量拼接正确的做法是
String sql =  " select a.col1,a.col2,a.col3 " 
+ " from tablea a ,tableb b "
+ " where a.col1 = b.col1 ";

请不要用appand进行拼接有限行数据.
不易读.
sql这东西占不了多少内存.
不需要节约.


看来以后拼sql都得换种方式了,学习了。
0 请登录后投票
论坛首页 Java企业应用版

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