Java为什么比C++慢?以及如何提高Java效率

水失雨唱处13
2013-10-13 · TA获得超过5281个赞
知道小有建树答主
回答量:959
采纳率:0%
帮助的人:1824万
展开全部
java为啥慢? 1、java的分配内存java只把内嵌类型分配到堆栈上面,所有Object类型都分配到堆上面。c++可以把局部变量都分配到堆栈上面。显然,根据已有测试结果,访问堆栈的速度要远高于堆的速度。 启示1:c++不要返回structure,可以用引用先传入返回对象;启示2:java对象不要随便抛弃,尽量延长其生命周期;但并不是说要维持一个对象pool;2、java没有模板没有模板的缺点就在于需要进行类型转换。类型转换是一个很耗时的操作。 如何减少类型转换? 3、 4、c++的内存占用如何?tr1自带的hashmap(int,int),一个占用16字节,是实际数据的2倍;stl自带的map(int,int),一个占用32字节,是实际数据的4倍;自己写的话,常见的是1.2倍左右的空间占用。 5、为什么java版本的底层结构效率不佳?a)java没有数组转对象的功能b)java对象内存位置是自动分配,无法控制 java基本结构的内存占用情况 a)每个object占用8字节b)对象8字节对齐c)array本身占用12字节java底层优化的建议written by goodzhu 1、rule No1:不要优化代码!注:必须编写足够可读的代码; 2、rule No2:选定优化目标注:一般只有20%左右的代码是瓶颈所在 3、通用优化技术 A、操作符简约注:如把"/=2^n"简化为">>=n"; B、公共表达式提取注:double x=d*a*b;double y=e*a*b;可以修改为:c=a*b;x=d*c;y=e*c; // 后2句在cpu层次可以并行计算 C、预先计算不变的值如:for(int i=0;i<N;i++)x[i] = Math.PI*Math.cos(y)*i;可以修改为:double d = Math.PI*Math.cos(y);for(int i=0;i<N;i++)x[i] = d*i;D、部分展开循环如:for(int i=0;i<N;i++)x[i]=i;可以修改为:for(int i=0;i<N;i+=3){x[i]=i;x[i+1]=i+1;x[i+2]=i+2;} 4、try结束循环技术如:for(int i=0;i<a.length;i++)a[i]=i*i;修改为:try{for(int i=0;;i++) a[i]=i*i;}catch(Exception nouse){}注意:这种技术节约了一次判断,只有在循环次数时很大(过千万)时才有效; 5、对基本数据结构的说明 A、数组拷贝,用System.arraycopyB、Arrays.sort方法在sort对象数组的时候,采用的是稳定的归并排序C、Arrays.sort方法在sort内嵌类型数组的时候,采用的不是introsort,不要希望它有stl::sort的速度D、Collections.sort方法会先把List拷贝成Array,然后调用Arrays.sort,速度很慢E、ArrayList的自增长比例是1.5,即每次不够了自动增长50%(+1)F、BitSet内部使用long数组来实现,在32位机器上面的速度不高G、HashMap的默认填充率是0.75H、PriorityQueue虽然是最小堆的数值实现,但其速度很慢,量大的时候,不如TreeMapI、Vector和ArrayList都不能用作需要删除操作的数组,如果需要,建议自己实现,可以采用延迟删除策略J、Map和HashMap都和c++的stl::map和stl::hashtable实现算法一样K、StringBuilder和StringBuffer的不同点在于后者可以多线程调用(自然速度就更慢)L、注意String著名的内存泄露问题!对于原始字符串很长时一定注意不要随便调用substring方法,应该直接拷贝 6、对正则表达式的说明 A、千万注意String.split方法,它的效率特别低,每次都需要编译表达式!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式