论坛首页 Java企业应用论坛

关于性能优化

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

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


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

int [] i =new int[1000000000];


说的就是你,你写不出来。
0 请登录后投票
   发表时间: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更好,但是也希望写出来更简洁的代码
0 请登录后投票
   发表时间: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");
}

像这样的代码删了吧...不然恶心的饭都要吐出来
0 请登录后投票
   发表时间:2010-12-31   最后修改:2010-12-31
bitray 写道
第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。

平常项目中这样的SQL很多. 为了可读性所以才不写成一个字符串. 而是写成拼接的方式. 但是代码规范要求必须用StringBuilder.
select *
from xxxx
where xxxxx
and xxxxx
我说明了是常量拼接. 纠缠变量神马的最讨厌了.
bitray 写道
我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。

我没说不让新手思考哇....你怎么得出这个结论的呢?
效率问题是就事论事...我的主张是不能一刀切...
强制使用StringBuilder妄图优化.才会把人套在框框里而不知道JVM居然还有优化....
抛出异常的爱 写道
行数不上千的string 拼接就是浮云怎么简单怎么来

抛哥说的对. 没见过几行SQL拼接还能影响多大系统性能的.
0 请登录后投票
   发表时间: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去链接啊。小弟水平有限,耳朵也软,千万别拍砖
0 请登录后投票
   发表时间:2010-12-31  
ouchxp 写道
bitray 写道
第一种链接其实是在欺骗自己。这个根本就是一个字符串。jvm必然会进行优化。你要是用变量进行连接你试试?马上就不是一个性能级别。

平常项目中这样的SQL很多. 为了可读性所以才不写成一个字符串. 而是写成拼接的方式. 但是代码规范要求必须用StringBuilder.
select *
from xxxx
where xxxxx
and xxxxx
我说明了是常量拼接. 纠缠变量神马的最讨厌了.
bitray 写道
我不反对你说的新手容易产生误区,但是其实良好的编程习惯和严格的步骤,总是对人成长有好处的。多思考一下,总比少想一点要好嘛。虽然容易造成过度设计,但是一旦走出来就会豁然开朗。

我没说不让新手思考哇....你怎么得出这个结论的呢?
效率问题是就事论事...我的主张是不能一刀切...
强制使用StringBuilder妄图优化.才会把人套在框框里而不知道JVM居然还有优化....
抛出异常的爱 写道
行数不上千的string 拼接就是浮云怎么简单怎么来

抛哥说的对. 没见过几行SQL拼接还能影响多大系统性能的.


呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵
如果表达不清楚的地方,兄弟海涵
0 请登录后投票
   发表时间: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");
}

像这样的代码删了吧...不然恶心的饭都要吐出来



向抛哥致敬,感谢抛哥经常回答小弟的问题。
0 请登录后投票
   发表时间:2010-12-31   最后修改:2010-12-31
bitray 写道
呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵
如果表达不清楚的地方,兄弟海涵

同是电信.你懂的.

0 请登录后投票
   发表时间:2010-12-31  
ouchxp 写道
bitray 写道
呃,或许小弟表达有所不明确。我没有别的意思的,真的。就是说可能想多了有时候容易迷糊,有时候容易顿悟。呵呵
如果表达不清楚的地方,兄弟海涵

同是电信.你懂的.




我现在也是进入电信行业了。可惜我一直在电信业务以外的系统里奔波。悲惨的每一天啊
0 请登录后投票
   发表时间:2011-01-14  
大循环内的考虑效率,大循环外的考虑可读
所有可能阻塞和会导致时间复杂度的地方都要注意效率,其他地方慢点就慢点好了
另外程序设计外的部分一定要考虑导致的软硬件cache命中率,单位时间磁盘随机读写次数,几次随机物理读写可能就让你大部分代码优化化成灰
如果真的从新手开始就考虑性能,绝对不是坏事,往后几年比那些不在乎性能的老人写出的应用块100-1000倍很有可能
有句话,写程序先让它可运行,然后正确运行,最后让它快速运行,千万别信。人和人能力是不一样的,说这话的人闭着眼睛写的代码都比我们多数人快,大部分人是没这天赋的,多想多写只有好处
0 请登录后投票
论坛首页 Java企业应用版

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