大量new临时对象可以是一种优化手段

标签: new 对象 优化 | 发表时间:2012-02-29 08:24 | 作者:杨博
出处:http://www.ac.net.blog.163.com

有C++经验的人往往知道,频繁在堆上分配对象对性能伤害很大。比如这样的代码就不是好代码:

   

void foo(int[] a) {

WrappedArray* wrappedArray = new WrappedArray(a);

wrappedArray->bar();

delete wrappedArray;

}

然而在JVM(指HotSpot虚拟机)上完全不是这样的。尽管JVM不提供在栈上创建对象的功能,但JVM会自动通过逃逸分析找出生命周期在函数范围内的临时对象,然后运行时优化这个函数,把对象创建放到栈上。逃逸分析在JRE7里面已经默认开启了,对临时对象多的代码效果很大。

Scala的隐式类型转换特性很鼓励创建临时对象,标准库中有大量的隐式转换,会生成许多临时对象(如 WrappedArrayArrayOpsStringAddWithFilter等)。我读标准库的源码时甚至感到他们已经把创建临时对象当成一种优化手段了。

比如C++常见的pimpl模式往往会让用户代码持有一个包装对象的指针,包装对象的内部有一个底层实现对象的指针。这种做法在Scala里面就完全不被主张,而更鼓励长期持有底层对象,而在需要用时再临时包装成对外接口。

这是因为,pimpl模式比直接持有底层对象多保存一个包装对象。如果在容器中保存大量包装对象时,额外的内存开销就会多起来,而每次函数调用也都会多一次间接寻址的开销。另一方面,只持有底层对象的话,虽然每次使用都会生成临时对象,但是这些临时对象经过JVM的逃逸分析、标量替换和内联优化后是零开销的。

但临时对象的开销取决于JVM的优化,然而JVM要在运行时优化,而且只有频繁运行的代码才会被优化。所以如果一个程序创建很多临时对象,那么刚启动时它的性能会很差,而运行一段时间后会慢慢变好。这也是为什么我们经常会感觉Java程序启动慢的原因之一。

相关 [new 对象 优化] 推荐:

大量new临时对象可以是一种优化手段

- - 为着理想勇敢前进
有C++经验的人往往知道,频繁在堆上分配对象对性能伤害很大. 比如这样的代码就不是好代码:. 然而在JVM(指HotSpot虚拟机)上完全不是这样的. 尽管JVM不提供在栈上创建对象的功能,但JVM会自动通过逃逸分析找出生命周期在函数范围内的临时对象,然后运行时优化这个函数,把对象创建放到栈上. 逃逸分析在JRE7里面已经默认开启了,对临时对象多的代码效果很大.

Hibernate调优之select new map()

- - CSDN博客架构设计推荐文章
        Hibernate调优不只是设置一下lazy,调整一下由谁来维护这个字段而已.         这次要说的是对查询语句进行优化——select new map().         select new map语句结果说明.         语句一:.         结果list中,每条记录对应一个object数组,object[]中每个元素为hql语句中列的序号(从0开始).

Gnome Shell 主题:New Adwaita-White 及 Black Glass

- Jason - Wow! Ubuntu
两个不错的 Gnome shell 主题,分别为 New Adwaita-White 及 Black Glass. 1 New Adwaita-White :  Gnome shell 默认主题的改进版. #Gnome Shell 主题的安装方法:把下载下来的压缩包解压缩,然后把文件夹名改为 theme,最后复制该文件夹到 /usr/share/gnome-shell/ 就可以了,记得先备份 /usr/share/gnome-shell/theme 文件夹.

Times New Roman字体的历史

- FQX - 东西
Times New Roman可谓无处不在——翻开美国国务院备忘录、《妇女家庭伴侣》的扉页,以及触手可及的收件箱——你会发现,它是世界上使用最广泛的字体. 半个多世纪以来,Times New Roman被归功于印刷界的“泰坦”——斯坦利·莫里森( Stanley Morison). 但在上世纪80年代,一名加拿大印刷工赫然发现,莫里森的Times New Roman可能涉嫌剽窃.

利用 new relic 监控 express 项目

- - snoopyxdy的博客
最近一个偶然的机会了解到代码剖析分析,何为剖析,我也解释不好就介绍下它的作用,通过作用来理解吧. 比如一个新项目上线,有许多功能,作为开发者和运维人员是不是很想知道各个功能点运行的怎么样,是否有内存泄露,响应是否迅速,各个功能点用户使用的频率等等信息呢. 另外如果发现了某一个功能使用起来特别慢,那我们能快速定位到,到底是数据库执行慢,还是代码性能问题,又或者是服务器内存不足频繁交换引起的呢.

MySQL优化之数据库结构:数据对象优化

- - CSDN博客数据库推荐文章
使用PROCEDURE ANALYSE函数优化表的数据类型. 表需要使用何种数据类型,是需要根据应用来判断的. 在MySQL中,可以使用函数PROCEDURE ANALYSE()对当前应用的表进行分析,该函数可以对数据库中列的数据类型提出优化建议,用户可以根据应用的实际情况斟酌考虑是否实施优化. 以下是函数PROCEDURE ANALYSE()的使用方法:.

Netty4底层用对象池和不用对象池实践优化

- - CSDN博客研发管理推荐文章
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作. 但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作. 为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制. 性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关).

6.60官方固件解包工具New PSARDumper 660

- 夜の猫 - 电玩巴士-PSP频道
  可能对于PSP破解比较熟悉的玩家都听说过New PSARDumper的名字,顾名思义,这款软件是对索尼的官方固件EBOOT.PBP进行解密的工具,自制系统的制作也是基于对官方固件的解密前提下. 由于索尼最新放出的6.60官方升级文件更换了加密方式,导致原有的解包工具无法正确进行解密.   如今,解包工具New PSARDumper更新了660版本,新版本支持6.60官方升级文件的解包,也就是说现在6.60系统的加密方式已经被破解.

苹果公司回应new iPad“发热门”事件

- - 雷锋网
苹果刚销售新产品才几天时间,就立马爆出使用问题,这种情况着实十分罕见. 苹果历来少有集中投诉事件发生,给人留下印象最深刻的一次是iPhone 4的天线接收信号问题,最后苹果承认这个问题确实存在,但解释说并非iPhone 4独有这个瑕疵,其他很多手机都存在这种情况. 现在出现的问题是,new iPad发热情况比iPad 2更严重.

New TV——深受启发的混合型产品

- tossking - 爱范儿 · Beats of Bits
我们经常听闻:移动互联网正在冲击某个行业:. 对于电视,这个综合型的市场(媒体+硬件)来说,它将是下一个受到冲击的行业吗. 我的观点如下:电视将受到移动互联网的启发,而非冲击. 新的电视(暂且称为 New TV ),将是一个混合型产品. New TV 将有两个屏幕,一个用于播放内容,另一个做延伸的交互.