锁定老帖子 主题:关于性能优化
精华帖 (2) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-30
hpjz2005 写道 ironsabre 写道 qianhd 写道 对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了
有些人习惯性的爱写内存泄漏的代码 真不知道怎么想的 我觉得新手想要写出内存泄漏的代码是很难的,或者说你让他写一段内存泄漏的代码他都写不出来。要不你写一个试试? int [] i =new int[1000000000]; 说的就是你,你写不出来。 |
|
返回顶楼 | |
发表时间:2010-12-30
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(); 哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反. 反编译看一下就知道为什么了. 第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。 我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。 PS,其实我也是新手没工作3,4年。我没有痴迷到研究哪个API更好,但是也希望写出来更简洁的代码 |
|
返回顶楼 | |
发表时间:2010-12-31
最后修改:2010-12-31
bitray 写道 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(); 哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反. 反编译看一下就知道为什么了. 第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。 我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。 PS,其实我也是新手没工作3,4年。我没有痴迷到研究哪个API更好,但是也希望写出来更简洁的代码 行数不上千的string 拼接就是浮云怎么简单怎么来 if(log.isDebug()){ log.debug("xxxx"+bean+"xxxxx"); } 像这样的代码删了吧...不然恶心的饭都要吐出来 |
|
返回顶楼 | |
发表时间:2010-12-31
最后修改:2010-12-31
bitray 写道 第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。
平常项目中这样的SQL很多. 为了可读性所以才不写成一个字符串. 而是写成拼接的方式. 但是代码规范要求必须用StringBuilder. select * from xxxx where xxxxx and xxxxx 我说明了是常量拼接. 纠缠变量神马的最讨厌了. bitray 写道 我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。
我没说不让新手思考哇....你怎么得出这个结论的呢? 效率问题是就事论事...我的主张是不能一刀切... 强制使用StringBuilder妄图优化.才会把人套在框框里而不知道JVM居然还有优化.... 抛出异常的爱 写道 行数不上千的string 拼接就是浮云怎么简单怎么来
抛哥说的对. 没见过几行SQL拼接还能影响多大系统性能的. |
|
返回顶楼 | |
发表时间:2010-12-31
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(); 哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反. 反编译看一下就知道为什么了. 另付 public static void main(String[] args) { String a = ""; long c1 = System.currentTimeMillis(); // StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000000; i++) { a += "1"; // sb.append("1"); } long c2 = System.currentTimeMillis(); System.out.println(c2 - c1); // System.out.println(a); // System.out.println(sb.toString()); } 这段代码,请分别注释执行,看下效果。 小弟测试,sb 是258到300毫秒之间,+连接执行了1分钟还没有完事。 不知道是不是我机器有所影响,但是可以见。变量链接是有所影响的。如果你那么写,是在欺骗自己,却无法欺骗虚拟机的。当然我不是有什么特殊的想法,就是说,在某些情况,这是很可能的。我过去做过银行的数据处理。1000万以上的数据很平常,其实api对性能,也是很明显的。所以,如果能连接,最好还是用sql去链接啊。小弟水平有限,耳朵也软,千万别拍砖 |
|
返回顶楼 | |
发表时间:2010-12-31
ouchxp 写道 bitray 写道 第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。
平常项目中这样的SQL很多. 为了可读性所以才不写成一个字符串. 而是写成拼接的方式. 但是代码规范要求必须用StringBuilder. select * from xxxx where xxxxx and xxxxx 我说明了是常量拼接. 纠缠变量神马的最讨厌了. bitray 写道 我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。
我没说不让新手思考哇....你怎么得出这个结论的呢? 效率问题是就事论事...我的主张是不能一刀切... 强制使用StringBuilder妄图优化.才会把人套在框框里而不知道JVM居然还有优化.... 抛出异常的爱 写道 行数不上千的string 拼接就是浮云怎么简单怎么来
抛哥说的对. 没见过几行SQL拼接还能影响多大系统性能的. 呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵 如果表达不清楚的地方,兄弟海涵 |
|
返回顶楼 | |
发表时间:2010-12-31
抛出异常的爱 写道 bitray 写道 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(); 哪种效率高? 答案是第一种. 对于新手来说想优化很容易适得其反. 反编译看一下就知道为什么了. 第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。 我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。 PS,其实我也是新手没工作3,4年。我没有痴迷到研究哪个API更好,但是也希望写出来更简洁的代码 行数不上千的string 拼接就是浮云怎么简单怎么来 if(log.isDebug()){ log.debug("xxxx"+bean+"xxxxx"); } 像这样的代码删了吧...不然恶心的饭都要吐出来 向抛哥致敬,感谢抛哥经常回答小弟的问题。 |
|
返回顶楼 | |
发表时间:2010-12-31
最后修改:2010-12-31
bitray 写道 呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵
如果表达不清楚的地方,兄弟海涵 同是电信.你懂的. ![]() |
|
返回顶楼 | |
发表时间:2010-12-31
ouchxp 写道 bitray 写道 呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵
如果表达不清楚的地方,兄弟海涵 同是电信.你懂的. ![]() 我现在也是进入电信行业了。可惜我一直在电信业务以外的系统里奔波。悲惨的每一天啊 |
|
返回顶楼 | |
发表时间:2011-01-14
大循环内的考虑效率,大循环外的考虑可读
所有可能阻塞和会导致时间复杂度的地方都要注意效率,其他地方慢点就慢点好了 另外程序设计外的部分一定要考虑导致的软硬件cache命中率,单位时间磁盘随机读写次数,几次随机物理读写可能就让你大部分代码优化化成灰 如果真的从新手开始就考虑性能,绝对不是坏事,往后几年比那些不在乎性能的老人写出的应用块100-1000倍很有可能 有句话,写程序先让它可运行,然后正确运行,最后让它快速运行,千万别信。人和人能力是不一样的,说这话的人闭着眼睛写的代码都比我们多数人快,大部分人是没这天赋的,多想多写只有好处 |
|
返回顶楼 | |