谈起java,给人的第一映像是什么?除了简单方便易上手,跨平台可移植,各种函数库支持类应有尽有不用重复造轮子这些特性之外,恐怕就是速度慢,占用内存高了吧。不可否认,java运行速度和内存占用方便确实无法比肩C/C++。随手举一个很直观的栗子,在ACM等其他算法竞赛中,普通给java的代码运行的时间往往都是C和C++ 2~~3倍,由此可见一斑。不过我们今天要说的就是,算法效率一样的情况下,如何去优化java的速度,让他在提供编码方便的同时,速度和内存上比肩一般的C和C++。
(/**博客记录了小菜寻找优化解法的过程 === 嫌拖拉的同学可以直接拉到最末看总结出的模板 */)
为了方便直观对运行时间和占用内存有直观的感受,我们拿 hdu 2602这个题目举栗子。因为在OJ上能直接给出程序的运行时间和占用内存。
hdu 2602 是一个没有任何变化的经典01背包问题,对于01背包问题,一维的dp做法在算法上已经到极致不能再优化了(参考dd巨巨的背包九讲)。在大家算法效率都是一样的情况下,我们看看速度和内存占用有多大差别。(提交语言都是java的情况下)
最开始我连续提交了好几次,虽然AC了,但是代码运行内存开销始终在1万3千多k,我继续往后翻了一下java的提交记录
大都是在1万多k 以上,虽然这数字看着有点大,但是既然那么多人都是这么大的内存占用,那就应该是java本身的问题了。 ========我继续往后翻=========可是当我继续往后翻的时候,就感觉不对了,同样是java,同样的算法,怎么还能有这么不可思议,整整少了一个数量级的内存占用,整整快了一倍的速度