2009年5月9日星期六

Java性能优化之实战漫谈[1]

——I can feel the need, the need of speed...
——提前优化是万恶之源

最近由于工作的原因,对Java的性能优化比较关注,其间也看到不少比较好的文章系列,比如Program-Think同学的Java性能优化系列。平常工作的时候,发现稍微有点好想法的时候,把自己独自一个人关在小屋子里集中精力思考,效果很不错,俗称“闭关”,大家也可以试一试。

谈到Java优化,我认为一切开始之前,最最重要的是找到一个合适的profile工具,这里有篇文章介绍的很详细:How to Fix Memory Leaks in Java,里面介绍了许多有用的profile工具,不用花太多时间,找到合适你自己的就行了,我用的是jprofile,感觉还不错。记住,重要的是,在每个优化开始之前,一定要用profile工具分析性能的问题出在哪边,千万不要想当然。

今天就先将两个简单的例子作为开头吧,大家轻松轻松。
例子一:
class A {
int a_num;
B b;
}
class B{
int b_num;
A a;
}

如果改成下面这样怎么样?

class AB {
int a_num;
int b_num;
}
某些Java应用程序当对象太多而垃圾回收器还没有来得及回收的时候,就可能会导致堆内存溢出,其实内存溢出是分为栈内存溢出和堆内存溢出的,关于堆和栈的区别,可以参考program-think的这篇文章,讲的通俗易懂。关于上面的这个例子,就是我在实际编码中发现的一个造成内存消耗严重的一个问题,你或许还会认为上面那种写法更技术,更××。如果A的实例和B的实例个数很少的时候还好,但是如果他们的实例个数达到上百万的级别的时候,你就会思考一下是不是要换成下面这种写法了。首先你要了解怎么去计算一个对象会占多少字节的内存,然后思考为什么下面的写法会比上面的占用更少的内存?

例子二:
如果你用Java写程序,那么你会怎么样把一个数组objct_array:Object[]加到一个list:java.util.List中去?
我并不清楚你是怎么写的,不过我却见过一种非常常用的写法:

list.addAll(java.util.Arrays.asList(objct_array));
其实,如果不是在内核运算的地方,或者某个对性能要求很高的地方写这句话完全没有问题,但如果在某个关键的地方,比如在某个要调用极多次数的方法里写用这个方法,也许就会出现问题。在这种地方,最好还是不要偷懒,用最原始但很高效的数组来解决问题。

Object[] old_array = array;
array = new Object[old_array.length + new_array.length];
System.arraycopy(old_array, 0, array, 0, old_array.length);
System.arraycopy(new_array, 0, array, old_array.lengyh, new_array.length);
事实上:ce_list.addAll(java.util.Arrays.asList(ce_array));这句效率是非常慢的,它将
一个数组变成了一个list又变成一个数组又变成一个list,因为内部是这样实现的:
public static List asList(Object[] a) {
return new ArrayList(a); // 新建了一个对象,同时数组变成一个list.
}
public boolean addAll(Collection c) {
Object[] a = c.toArray(); // 看这里, list又变成了一个数组,绕了一圈啊
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew); // 这个跟修改后做的差不多
size += numNew;
return numNew != 0;
}
结果证明:修改后这部分消耗的临时内存没有了,速度也变快了。

2009年4月25日星期六

信息2.0(译文)

这篇文章的作者是印度一家公司www.InRev.org的市场总监,这是一家十分年轻的公司,刚刚成立不久,致力于数据分析。就像它的名字InRev一样,他们野心勃勃的想要参与到信息革命中的浪潮来,并在其中充当至关重要的弄潮儿。 
在作者的另外一篇博客Analytics Industry(分析工业)中曾指出在中国这样数据分析公司几乎没有,而国外这些公司已经小有规模,中国如果想要赶上信息革命的浪潮,也许应该具备更长远的眼光。 


这篇文章主要指出了市场对于智能处理数据的需求,介绍了Web上现有的一些处理工具和报表工具,指出信息2.0的时代已经到来——

----------------------------------------

----------------------------------------

信息2.0

作者:Deep Sherchan

译者:YantseFisher

原文地址:http://engineeringanalytics.blogspot.com/2008/11/information-20.html

发表日期 2008年11月21日,星期五

毫无疑问,这是信息的时代。但是,随着数据量的增长和大量冗余的出现,我们很容易就会迷失在这些海量的数据中。你是否记得你有多少次坐在电脑前为了去查找某个具体知识的相关内容,发现自己毫无目的的漫游了几个小时,忘记了你原来的意图。经常这样,不是吗?


Google通过提供高效率的搜索引擎,使得我们查找这些信息数据变得容易多了。不知怎么的,我们所有的人都开始变得懒惰起来,甚至不愿意去记住那些网站的名字,因为我们都很相信搜索引擎。那么信息革命的下一步是什么?分析?


好吧,我并不是要吹嘘我的专业背景,但是当信息量太大的时候,你当然需要某个东西去分析它们,还有...还有什么?还有就是要把他们报告给最终用户。


最终,我们需要的是定义明确,解释清楚的信息。所以,你不难在这里或者那里发现很多报表工具。但是,你能够经常找到一个网络报表入口,并且它是基于开源软件的哲学吗?我曾遇到过的这样一个工具是OpenI.


当我们讨论报表工具的时候,根据数据量的不同大小,他们是基于不同的数据库系统或者结构。最常见到的数据库系统有MySQLOraclePostGreSQLSQL等等。但是,报表并不是直接从数据库服务器制作而来的,在他们之间还需要一些中间层,以便让这些数据能够被处理成需要的形式。


在OpenI中,这些中间层就是发布于J2EE服务器上的OLAPRDBMS。技术上说,OpenI是某些基于Java的工具的整合,像JPivotJFreeChartMondrianJasper Report


它提供了一种简单的方式去将处理过的OLAP数据和最终用户联系起来,通过文字图形和图表的形式,用户只要简单的单击按钮,然后进行查询处理。使用它非常有趣,尤其当他是基于网络的。今后不久,各种信息处理器便会冲斥市场,这是必然的。


由于市场上对于智能数据的需求,我十分确信的告诉诸位,这就是我们正在提及的信息2.0的时代。

2009年4月6日星期一

读《少有人走的路》

在谈及这本书 之前,先说说一些个人经历。本人作为一个不修边幅的80后男生,平常对穿着打扮实在不太感冒,认为浪费时间。去年回家过年,我妈认为我头发太难看,逼着我去理发,而我这个从不烫发的老实小子怀着叛逆的心理第一次去理发店烫了个稍显古怪的发型。说实话,我自己也不喜欢这个发型,回南京有空就把它修理了。重要的不是发型,而是我所想要表达的,那种渴望独立的心情。正如不久前,即将毕业时,自己和父母在关于选择人生道路时的分歧一样,我所想要表达是每个人都应该选择他自己的独一无二的道路,这是一个心智成熟的旅程,而每个人的这条道路对于其他人来说都是“少有人走的”。
《少有人走的路》是一本畅销书,可是看到它时却不是在什么《纽约时报》的畅销书排行榜上,而是从好朋友的豆瓣上看到的,副标题是“心智成熟的旅程”。人可以拒绝任何东西,但绝不可以拒绝成熟。正如译者在序中所说:“如果说以前中国人最大的问题是温饱问题,那么,今天,中国人最大的问题就是心理问题,而心智不成熟又是心理问题中最大的问题”。这本书的作者,M.斯科特.派克,是一名杰出的心理医生,该书的观点和思想,大多来自于他的从业经历。我们长期以来的想法和感受,终有一天会被一些陌生人一语道破,而派克或许就是其中的一个。

这本书的大多数内容在论述关于心理问题以及心智成熟的话题,自律,爱,成长和宗教,神奇的力量。然而,让我最感兴趣并且读起来津津有味的却是最后部分关于“神奇的力量”的论述。如果大家在高中或者大学学过物理的话,可能会知道所谓热力学第二定律,世界由有序向无序发展,能量从有规律的状态流向无规律的状态,从高度分化流向低度分化,宇宙处于逐渐分解状态,直至达到没有组织不再分化的状态,就像流水一样,永远只从高处往低处流动。根据热力学第二定律,经过十亿年时间,宇宙会完全分解,其高度降至最低点,成为没有任何形状和结构、不再发生分化的死寂状态,这种没有组织、不再发生分化的状态,我们称之为“熵”。而这种导致能量自然的从高处流向低处,最终进入熵的状态的作用,称为“熵的力量”。现在我们已经知道,生物进化过程与熵的力量彼此抵触,由此联想到,生物的死亡是不是也是一种“熵的力量”,与生物成长相抵触。进化过程是由低向高的发展,在此过程中,事物变得更复杂,更具分化性,更有组织性。

关于进化过程,作者把它画成一座金子塔,如下:



类似的,作者提出了人类的心灵进化的金子塔图形。因此,作者指出,心灵的成长,心智的成熟,需要不断的努力,必然是艰苦的过程,因为在这一过程中,它必须和自然的力量——熵的力量对抗。如同生物进化一样,我们的心灵还是克服了熵的力量,并得以成长。心灵进化的金子塔图形,适用于每一个人。



那么阻碍心智成熟的障碍,即所谓心智成熟过程中“熵的力量”是什么呢?作者认为,最大的障碍就是懒惰。只要克服懒惰,其他阻力都能迎刃而解。不难理解,每个人都有保持现状的惰性,害怕去改变,因为改变会带来痛苦和未知的麻烦。正是这种惰性阻碍了各种通往高级层次状态的可能性道路,也许连第一步你都没有跨出去。

对于这些话题,我只是拾人牙慧,如果您感兴趣,更多的内容在书中,慢慢去看吧。

关注者