`
piao_bo_yi
  • 浏览: 4458 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于性能优化

阅读更多
我发现一个现象,很多两三年以下的人写代码动不动就扯性能,其实他们大部分人根本不知道到底哪是性能瓶颈,函数调用的效率,CPU执行指令需要的时间...工作效率低不说,还考虑很多没用的东西。个人感觉,性能这个东西应该考虑:
1.考虑程序的应用范围。如果你是给核反应堆写实时程序,那每一步你可能都得考虑,其他就大部分通用程序而言,你不用每一步都考虑。
2.性能要考虑关键瓶颈。不是每一步都是关键,关键瓶颈不是写之前提前考虑出来的,而是测出来的。很多你以为瓶颈的地方往往不是瓶颈。
3.低效的算法+大量的处理数据两者结合往往是导致效率低下的根本原因,而函数调用,拆分函数等不是。JAVA初学者喜欢怀疑函数调用,C++派则彻底怀疑继承结构和堆上的数据,很有意思的现象。即使低效的算法处理小量数据也没必要优化,e.g.冒泡排序和快速排序在排少量数据的时候的性能差异不需要考虑。

大家说说自己的看法。

P.S.编程里面真的有很多不符合直觉的结论。比如边开发边考虑性能优化是否必要,比如添加人手是否能提高项目进度,真的是很有意思。
分享到:
评论
115 楼 ouchxp 2010-11-19  
http4j 写道
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();

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


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

怀疑是你理解错了。String常量才会出现这种情况,变量还是推荐用第二种。

已经说明了是常量拼接的情况,怀疑你是没看到. 如LS所述SQL通常是常量拼接
114 楼 dsjt 2010-11-19  
http4j 写道
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();

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


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

怀疑是你理解错了。String常量才会出现这种情况,变量还是推荐用第二种。

呢,不是,
我写sql,最初一个字符串,被说可读性差,就改成连+,被要求用StringBuffer
113 楼 http4j 2010-11-18  
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();

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


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

怀疑是你理解错了。String常量才会出现这种情况,变量还是推荐用第二种。
112 楼 http4j 2010-11-18  
有人批评我函数体写的太小,会影响性能,有时候听了我都不知道该跟他讲什么。
111 楼 ironsabre 2010-11-18  
zhangyou1010 写道
新手还是有可以考虑的地方的吧:

比如Integer i = new Integer(20) ; 和Integer j = Integer.valueOf(20);

虽然简单的这两行不见得会有多少差别,但是这样的代码多了,或者是在循环里面,

是不是...........


哈哈,lz想要的人出现了,其实lz想批评的正是你这种。
实际项目中真正由这种代码引起系统慢的情况是非常少见的。
如果你花心思在这种级别的代码上试图优化系统的话,基本上就完蛋了。
110 楼 zhangyou1010 2010-11-18  
新手还是有可以考虑的地方的吧:

比如Integer i = new Integer(20) ; 和Integer j = Integer.valueOf(20);

虽然简单的这两行不见得会有多少差别,但是这样的代码多了,或者是在循环里面,

是不是...........
109 楼 zhangyou1010 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都得换种方式了,学习了。
108 楼 sarstime 2010-11-18  
dsjt 写道
qianhd 写道
li445970924 写道
求一段内存泄露的代码


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

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




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





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

应该不是,恐怕他认为返回一个map的list的一成员的引用出去是不妥当。
不过我觉得这个要看业务逻辑,就一段代码片段说明不了什么。
107 楼 dsjt 2010-11-18  
qianhd 写道
li445970924 写道
求一段内存泄露的代码


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

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




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





请教,图片中的代码极品在何处??
是把list 放 map 里么 ? 还是frame==null 的位置不恰当?
106 楼 dsjt 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 效率高
105 楼 ironsabre 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,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的


一般只要不是在循环里,用什么都无所谓。喜欢用哪个就用哪个。
104 楼 darrendu 2010-11-18  
hlylove 写道
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

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


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

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


用长生命周期对象,引用短生命周期对象,就行了吧!
103 楼 darrendu 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,原因我说不清楚,但是感觉没必要,你怎么理解这个问题的
102 楼 ironsabre 2010-11-18  
qdexception 写道
ouchxp 写道
新手避免性能问题,就让他按规范操作就可以.(不许循环里调用数据库....XXXX)


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

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

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

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

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

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


密集表查询比较适合用pl/sql来解决。
101 楼 xuzhfa123 2010-11-18  
过早进行代码优化是万恶之源
100 楼 hlylove 2010-11-18  
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

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


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

新手都未必知道什么是内存泄露。对于java,新手写一段内存泄漏的代码还真不好写。
99 楼 qdexception 2010-11-18  
ouchxp 写道
新手避免性能问题,就让他按规范操作就可以.(不许循环里调用数据库....XXXX)


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

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

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

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

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

像这种情况一般都怎么解决呢?望指教!
98 楼 莫生气 2010-11-17  
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.



这个总结的经典啊.一般认为是瓶颈的往往不是哈
97 楼 liuyupy 2010-11-17  
kyh23_y 写道
ironsabre 写道
flysnowxf 写道
ironsabre 写道
flysnowxf 写道
汗,这是很基础的概念了。
百度百科:http://baike.baidu.com/view/714962.htm

引用
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。


再说一次,向集合里一直加东西不删除,这个不叫内存泄漏。


那是你的理解了。我的理解是,分配了内存,但这些内存不再被使用,比如过期了、没用了,但又没有去删除,造成内存占用越来越多。HashMap的使用就容易出现这个问题。


哎。你这个没过期,也有用。你可以通过HashMap取出来值的,这怎么能叫泄漏呢?
我现在总是你,如果你向cache里放了100个对象,永远keep住,如果我应用程序经常来访问它,叫不叫泄漏?
如果我应用程序再也不来访问它,叫不叫泄漏?
按你的理解,第一种不叫,第二种叫。可这两种没有区别。我不可能用由第三方来判断我自己是不是泄漏,明白吗?

下面这个Stack,在被别人用的时候,可能会引起泄漏。你先找找看哪行会出总是。然后再理解一下跟你这个有什么区别。
import java.util.Arrays;
import java.util.EmptyStackException;

public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}

public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}

/**
* Ensure space for at least one more element, roughly doubling the capacity
* each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}


既然那些对象我一直在用,那为什么会被叫做是泄露?难道我用那100个对象也有错?
应该是当我没用那所有对象,或者是某些对象的时候,又没有在Map里面remove掉那些对象,导致了map一直持有引用,根据gc的原理,这样的对象是不会被回收的,这样才造成了泄露吧.这是我的理解

实际上无用,而还被引用的对象,甚至引用名柄程序自身都无法获得..http://javag.iteye.com/blog/157522
96 楼 qianhd 2010-11-17  
li445970924 写道
求一段内存泄露的代码


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

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




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


相关推荐

    Oracle性能优化技术内幕

    本书讲述Oracle 性能优化技术。书中对给出的每一种优化方法和措施都从...年以来关于性能优化人们一直认为是正确的某些错误观点和方法提出了批判,令人信服地证明了这些观 点和方法的荒诞,提出了较为正确的观点和方法。

    性能优化.7z

    "性能优化.7z"这个压缩包文件很可能包含了一系列关于性能优化的技术文档、代码示例或者工具,帮助我们理解和实践性能优化的方法。尽管没有具体的标签来细化这些内容,我们可以根据一般性能优化的常见领域进行讨论。 ...

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...

    大型网站性能优化实战从前端网络CDN到后端大促的全链路性能优化 带书签完整版

    ### 大型网站性能优化实战从前端网络CDN到后端大促的全链路性能优化 #### 一、基于用户体验的性能优化要素 在现代互联网应用中,用户体验是衡量一个网站成功与否的重要标准之一。良好的用户体验不仅仅体现在美观的...

    Android性能优化.pdf

    【Android性能优化】是Android开发中的重要环节,涵盖了多个关键领域,包括ANR问题解析、crash监控方案、启动速度与执行效率优化、内存优化、耗电优化、网络传输与数据存储优化以及APK大小优化。 **ANR问题解析**是...

    C++性能优化技术导论.pdf

    C++性能优化是一个复杂的主题,它涉及编译器、算法、语言特性、硬件架构以及操作系统等多个层面。性能优化的目标是提升软件执行效率,减少资源消耗,缩短响应时间,以及提高吞吐量。下面将详细介绍这些性能优化的...

    Unity性能优化.pptx

    Unity性能优化 Unity性能优化是指在游戏开发中提高游戏性能的过程,包括优化CPU和GPU的使用,以提高游戏的帧率和画质。下面是 Unity性能优化的相关知识点: 1. Unity性能调试工具及使用方法 Unity提供了多种...

    Java 大型网站性能优化实战从前端网络 CDN 到后端大促的全链路性能优化

    在构建和运行大型Java网站的过程中,性能优化是至关重要的,它直接影响着用户体验、服务器资源的利用率以及业务的可扩展性。本实战指南将探讨从前端网络到后端大促的全链路性能优化策略,旨在提升网站的整体效率。 ...

    《Java程序性能优化》(葛一鸣)PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于Java程序性能优化的书籍,作者是葛一鸣,并提供了该书PDF版本的下载链接。虽然没有具体的书籍内容,但基于标题、描述以及通常这类书籍会涉及的主题,我们可以总结出...

    达梦数据库的性能优化收集.pdf

    达梦数据库性能优化 达梦数据库作为国产数据库市场占有率第一的高性能、高可靠性、高安全性、高兼容性大型关系型数据库管理系统,已经成功替代了Oracle,在电力、金融、电子政务、教育等行业领域得到了广泛的应用,...

    Tomcat性能优化

    【文件】:“Tomcat7性能优化调优.docx”可能包含了关于Tomcat7性能优化的具体步骤、最佳实践和案例分析,这对于我们深入理解如何优化Tomcat7非常有价值。 以下是一些可能的Tomcat性能优化知识点: 1. **内存配置*...

    性能优化PPT.pdf

    ### 性能优化的核心概念与实践 #### 一、什么是性能优化? 性能优化是指通过一系列技术和方法提升系统或应用程序在处理任务时的速度、效率及稳定性等指标的过程。它旨在充分发挥硬件资源的优势,同时减少不必要的...

    性能优化-网站性能监测与优化

    Web前端性能优化数据 性能优化Web前端性能优化数据 性能优化Web前端性能优化数据 性能优化Web前端性能优化数据 性能优化

    【超级好】C++应用程序性能优化.pdf

    C++应用程序性能优化C++应用程序性能优化

Global site tag (gtag.js) - Google Analytics