锁定老帖子 主题:关于性能优化
精华帖 (2) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-18
ironsabre 写道 qianhd 写道 对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了
有些人习惯性的爱写内存泄漏的代码 真不知道怎么想的 我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试? 新手都未必知道什么是内存泄露。对于java,新手写一段内存泄漏的代码还真不好写。 |
|
返回顶楼 | |
发表时间:2010-11-18
过早进行代码优化是万恶之源
|
|
返回顶楼 | |
发表时间:2010-11-18
qdexception 写道 ouchxp 写道 新手避免性能问题,就让他按规范操作就可以.(不许循环里调用数据库....XXXX)
俺是新手,想问一下,如果不在循环里调用数据库,一般都是用什么解决方案? 俺以前写的一个功能,是每次遍历都要查询出几个表的相关数据,然后经过逻辑判断再插入和更新表。 像这样的需求应该怎么实现? 先查询出所有需要的数据分别放入不同集合类,再遍历集合类去做判断,把插入或更新的条件放入集合类X,再遍历X去做批量的update操作吗? 俺做逻辑判断所需要的数据挺多的,例如要先查A表,再查B表,再查C表,再查D表,而A,B,C,D表都超过百万甚至上千万数据。 像这种情况一般都怎么解决呢?望指教! 密集表查询比较适合用pl/sql来解决。 |
|
返回顶楼 | |
发表时间: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,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的 |
|
返回顶楼 | |
发表时间:2010-11-18
hlylove 写道 ironsabre 写道 qianhd 写道 对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了
有些人习惯性的爱写内存泄漏的代码 真不知道怎么想的 我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试? 新手都未必知道什么是内存泄露。对于java,新手写一段内存泄漏的代码还真不好写。 用长生命周期对象,引用短生命周期对象,就行了吧! |
|
返回顶楼 | |
发表时间: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,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的 一般只要不是在循环里,用什么都无所谓。喜欢用哪个就用哪个。 |
|
返回顶楼 | |
发表时间: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 效率高 |
|
返回顶楼 | |
发表时间:2010-11-18
最后修改:2010-11-18
qianhd 写道 li445970924 写道 求一段内存泄露的代码
你的代码中肯定有 只是你没发觉而已 或者你代码的对象的生命周期就是那么长 释放不掉的内存就算是内存泄漏 就算是C++ 没有free的内存 在进程结束的时候也会被释放 并不是说 一个map中垃圾数据 你可以通过remove来释放 就不算内存泄漏 一个程序 持续的运行 使用内存不断变大 对象不断增多 肯定是在泄漏 最常见的就是新增需求后 需要观察者模式 然后就简单的增加一个对象加入到listener中 但却不想想什么时候remove 这是让我觉得极品的代码之一 我非常想知道这人写的时候是怎么想的 请教,图片中的代码极品在何处?? 是把list 放 map 里么 ? 还是frame==null 的位置不恰当? |
|
返回顶楼 | |
发表时间:2010-11-18
最后修改:2010-11-18
dsjt 写道 qianhd 写道 li445970924 写道 求一段内存泄露的代码
你的代码中肯定有 只是你没发觉而已 或者你代码的对象的生命周期就是那么长 释放不掉的内存就算是内存泄漏 就算是C++ 没有free的内存 在进程结束的时候也会被释放 并不是说 一个map中垃圾数据 你可以通过remove来释放 就不算内存泄漏 一个程序 持续的运行 使用内存不断变大 对象不断增多 肯定是在泄漏 最常见的就是新增需求后 需要观察者模式 然后就简单的增加一个对象加入到listener中 但却不想想什么时候remove 这是让我觉得极品的代码之一 我非常想知道这人写的时候是怎么想的 请教,图片中的代码极品在何处?? 是把list 放 map 里么 ? 还是frame==null 的位置不恰当? 应该不是,恐怕他认为返回一个map的list的一成员的引用出去是不妥当。 不过我觉得这个要看业务逻辑,就一段代码片段说明不了什么。 |
|
返回顶楼 | |
发表时间: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都得换种方式了,学习了。 |
|
返回顶楼 | |