`
piao_bo_yi
  • 浏览: 4520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于性能优化

阅读更多
我发现一个现象,很多两三年以下的人写代码动不动就扯性能,其实他们大部分人根本不知道到底哪是性能瓶颈,函数调用的效率,CPU执行指令需要的时间...工作效率低不说,还考虑很多没用的东西。个人感觉,性能这个东西应该考虑:
1.考虑程序的应用范围。如果你是给核反应堆写实时程序,那每一步你可能都得考虑,其他就大部分通用程序而言,你不用每一步都考虑。
2.性能要考虑关键瓶颈。不是每一步都是关键,关键瓶颈不是写之前提前考虑出来的,而是测出来的。很多你以为瓶颈的地方往往不是瓶颈。
3.低效的算法+大量的处理数据两者结合往往是导致效率低下的根本原因,而函数调用,拆分函数等不是。JAVA初学者喜欢怀疑函数调用,C++派则彻底怀疑继承结构和堆上的数据,很有意思的现象。即使低效的算法处理小量数据也没必要优化,e.g.冒泡排序和快速排序在排少量数据的时候的性能差异不需要考虑。

大家说说自己的看法。

P.S.编程里面真的有很多不符合直觉的结论。比如边开发边考虑性能优化是否必要,比如添加人手是否能提高项目进度,真的是很有意思。
分享到:
评论
35 楼 agapple 2010-11-16  
jdk 6后系统性能已经好了很多,扣个几行代码或者函数调用少几次效果不明显

性能问题最大的还是I/O操作,比如文件I/O,网络I/O(数据库,rpc调用)等,像数据库少调用一次平均可以减少2ms,这可以执行几亿次for循环了

34 楼 sunlight9641 2010-11-16  
piao_bo_yi 写道
我发现一个现象,很多两三年以下的人写代码动不动就扯性能,其实他们大部分人根本不知道到底哪是性能瓶颈,函数调用的效率,CPU执行指令需要的时间...工作效率低不说,还考虑很多没用的东西。个人感觉,性能这个东西应该考虑:
1.考虑程序的应用范围。如果你是给核反应堆写实时程序,那每一步你可能都得考虑,其他就大部分通用程序而言,你不用每一步都考虑。
2.性能要考虑关键瓶颈。不是每一步都是关键,关键瓶颈不是写之前提前考虑出来的,而是测出来的。很多你以为瓶颈的地方往往不是瓶颈。
3.低效的算法+大量的处理数据两者结合往往是导致效率低下的根本原因,而函数调用,拆分函数等不是。JAVA初学者喜欢怀疑函数调用,C++派则彻底怀疑继承结构和堆上的数据,很有意思的现象。即使低效的算法处理小量数据也没必要优化,e.g.冒泡排序和快速排序在排少量数据的时候的性能差异不需要考虑。

大家说说自己的看法。

P.S.编程里面真的有很多不符合直觉的结论。比如边开发边考虑性能优化是否必要,比如添加人手是否能提高项目进度,真的是很有意思。


赞同楼主的看法。
如果再加上根据开发规范(这个规范并没有统一的),进行代码书写就更加完美了:)
33 楼 shuofenglxy 2010-11-16  
性能是什么指标? 就是你使用中发现达不到自己的要求标准(或者是预计到某段时间后达不到期望底限了)了,这样的情况下才想到优化,而优化往往和重构一起出现,学会分析优化才是最关键的,不要以为每一句代码都对性能起到关键性的影响,分析性能瓶颈,提出可行方案,验证优化结果,不行就继续调整方案。这才是优化的思想。不要为了优化而优化,没有可预计的用途不要为了重构而去重构,即使代码你觉得很乱。
32 楼 chptcleo 2010-11-16  
Java程序确实也有很多需要优化的地方,但更重要的是庞大的数据库存取优化
31 楼 ironsabre 2010-11-16  
flysnowxf 写道
ironsabre 写道
flysnowxf 写道
汗,这是很基础的概念了。
百度百科:http://baike.baidu.com/view/714962.htm

引用
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。


再说一次,向集合里一直加东西不删除,这个不叫内存泄漏。


那是你的理解了。我的理解是,分配了内存,但这些内存不再被使用,比如过期了、没用了,但又没有去删除,造成内存占用越来越多。HashMap的使用就容易出现这个问题。


哎。你这个没过期,也有用。你可以通过HashMap取出来值的,这怎么能叫泄漏呢?
我现在总是你,如果你向cache里放了100个对象,永远keep住,如果我应用程序经常来访问它,叫不叫泄漏?
如果我应用程序再也不来访问它,叫不叫泄漏?
按你的理解,第一种不叫,第二种叫。可这两种没有区别。我不可能用由第三方来判断我自己是不是泄漏,明白吗?

下面这个Stack,在被别人用的时候,可能会引起泄漏。你先找找看哪行会出总是。然后再理解一下跟你这个有什么区别。
import java.util.Arrays;
import java.util.EmptyStackException;

public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}

public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}

/**
* Ensure space for at least one more element, roughly doubling the capacity
* each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
30 楼 flysnowxf 2010-11-16  
ironsabre 写道
flysnowxf 写道
汗,这是很基础的概念了。
百度百科:http://baike.baidu.com/view/714962.htm

引用
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。


再说一次,向集合里一直加东西不删除,这个不叫内存泄漏。


那是你的理解了。我的理解是,分配了内存,但这些内存不再被使用,比如过期了、没用了,但又没有去删除,造成内存占用越来越多。HashMap的使用就容易出现这个问题。
29 楼 qvjing520 2010-11-16  
JDialog d= new JDialog();
d.setVisiable(true);
当你不需要的的时候你直接d.setVisiable(false);
你甚至可以这样d=null;
看看这个对象能被释放吗
内存泄露就是写代码不注意来的
28 楼 ironsabre 2010-11-16  
flysnowxf 写道
汗,这是很基础的概念了。
百度百科:http://baike.baidu.com/view/714962.htm

引用
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。


再说一次,向集合里一直加东西不删除,这个不叫内存泄漏。
27 楼 flysnowxf 2010-11-16  
汗,这是很基础的概念了。
百度百科:http://baike.baidu.com/view/714962.htm

引用
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。
26 楼 ironsabre 2010-11-16  
flysnowxf 写道
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

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


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

如果写本地缓存的话,是很容易出现的。比如new HashMap(),然后不断往里边put(Object),但却不记得remove或者后台起一个线程去remove,结果hashMap里边的数据越来越多,里边引用的Object却不能被垃圾收回。这种内存泄露的情况非常普遍。

关于性能优化,在没有经验积累的情况,建议先测出来瓶颈在哪里。比如jprofile就很容易分析出哪段代码花费cpu的时间比较长。以我的经验来看,性能瓶颈主要在数据库和网络通信。


哥哥,一直往集合里加东西但不删除,这个不叫内存泄漏。
25 楼 ironsabre 2010-11-16  
li445970924 写道
求一段内存泄露的代码


真不太好写,需要基础比较好的人才写得出来。
24 楼 flysnowxf 2010-11-16  
ironsabre 写道
qianhd 写道
对于新手 写的时候动动脑子 别写出内存泄漏的代码 就谢天谢地了

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


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

如果写本地缓存的话,是很容易出现的。比如new HashMap(),然后不断往里边put(Object),但却不记得remove或者后台起一个线程去remove,结果hashMap里边的数据越来越多,里边引用的Object却不能被垃圾收回。这种内存泄露的情况非常普遍。

关于性能优化,在没有经验积累的情况,建议先测出来瓶颈在哪里。比如jprofile就很容易分析出哪段代码花费cpu的时间比较长。以我的经验来看,性能瓶颈主要在数据库和网络通信。
23 楼 javazeke 2010-11-16  
性能差,全是懒出来的
22 楼 li445970924 2010-11-16  
让我涨涨见识
21 楼 li445970924 2010-11-16  
求一段内存泄露的代码
20 楼 ouchxp 2010-11-16  
cloud21 写道
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.

优化对于一些项目很有必要
按照你的推理,新人,老人,都不做优化
一般,什么样人,优化,调优呢。
包括,具体优化具体要注意些什么,请教了。


有问题 再优化
19 楼 ironsabre 2010-11-16  
cloud21 写道
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.


优化对于一些项目很有必要

按照你的推理,新人,老人,都不做优化

一般,什么样人,优化,调优呢。

包括,具体优化具体要注意些什么,请教了。


当然不是说都不做优化。只是说,优化的时候找准地方非常重要。这个很需要经验。
比如说一个系统变慢了,有经验的人发现是走错了索引,调整了一下,性能恢复了。
而有些新手,如果你去ArrayList,LinkedList层面的查找的话,找再久也没用,也许你能提升0.0xx秒的速度,但who care?
18 楼 fujohnwang 2010-11-16  
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.

I agree with these words
17 楼 BestUpon 2010-11-16  
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.

经典!
16 楼 cloud21 2010-11-16  
抛出异常的爱 写道
对于性能
1.对于新手.不要优化.
2.对于老手.建议不要优化.


优化对于一些项目很有必要

按照你的推理,新人,老人,都不做优化

一般,什么样人,优化,调优呢。

包括,具体优化具体要注意些什么,请教了。

相关推荐

    Oracle性能优化技术内幕

    本书讲述Oracle 性能优化技术。书中对给出的每一种优化方法和措施都从...年以来关于性能优化人们一直认为是正确的某些错误观点和方法提出了批判,令人信服地证明了这些观 点和方法的荒诞,提出了较为正确的观点和方法。

    性能优化.7z

    "性能优化.7z"这个压缩包文件很可能包含了一系列关于性能优化的技术文档、代码示例或者工具,帮助我们理解和实践性能优化的方法。尽管没有具体的标签来细化这些内容,我们可以根据一般性能优化的常见领域进行讨论。 ...

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    千金良方:MySQL性能优化金字塔法则.docx

    MySQL性能优化金字塔法则 MySQL性能优化是指通过调整MySQL数据库的配置、优化数据库结构和查询语句等方式,提高MySQL数据库的性能和响应速度,以满足应用程序的需求。MySQL作为最流行的开源数据库之一,被广泛应用...

    【05】性能优化.7z

    本资料"【05】性能优化.7z"可能包含了一系列关于性能优化的文档、代码示例或者教程,旨在帮助开发者深入理解并实践性能优化技术。下面将详细讨论性能优化的多个方面。 一、性能分析与监控 性能优化的第一步通常是...

    oracle数据库性能优化.pdf

    Oracle数据库性能优化是确保系统高效运行的关键环节,尤其是在大数据量和高并发的环境中。Oracle数据库因其先进、完整和集成的特性,在市场中占据主导地位,因此深入理解和掌握Oracle的优化技术至关重要。 首先,...

    EBS性能调优之全面挖掘_V4.2(ebs性能优化、oracle性能优化、linux性能优化)

    数据库层优化主要包括两个方面:实例性能优化和SQL语句性能优化。实例优化涉及内存配置、后台进程调整和初始化参数设置,以确保数据的高效读写和处理。SQL优化则侧重于通过分析SQL执行计划,识别慢查询并应用索引、...

    更快、更强—— AIX性能优化

    标题与描述概述的知识点主要集中在AIX系统的性能优化策略,特别是针对处理速度的提升,重点关注的是CPU性能。本文将深入探讨这些知识点,提供一个全面的视角来理解AIX性能优化的关键方面。 ### AIX性能优化基础概念...

    Android性能优化.pdf

    【Android性能优化】是Android开发中的重要环节,涵盖了多个关键领域,包括ANR问题解析、crash监控方案、启动速度与执行效率优化、内存优化、耗电优化、网络传输与数据存储优化以及APK大小优化。 **ANR问题解析**是...

    CSAPP性能优化实验

    《CSAPP性能优化实验》是计算机科学与应用(Computer Science and Application Programming)课程的一个实践环节,旨在提升学生对程序性能优化的理解与技能。在这个实验中,我将详细探讨三个关键的优化策略,并结合...

    C++性能优化技术导论.pdf

    C++性能优化是一个复杂的主题,它涉及编译器、算法、语言特性、硬件架构以及操作系统等多个层面。性能优化的目标是提升软件执行效率,减少资源消耗,缩短响应时间,以及提高吞吐量。下面将详细介绍这些性能优化的...

    Unity性能优化.pptx

    Unity性能优化 Unity性能优化是指在游戏开发中提高游戏性能的过程,包括优化CPU和GPU的使用,以提高游戏的帧率和画质。下面是 Unity性能优化的相关知识点: 1. Unity性能调试工具及使用方法 Unity提供了多种...

    《Java程序性能优化》(葛一鸣)PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于Java程序性能优化的书籍,作者是葛一鸣,并提供了该书PDF版本的下载链接。虽然没有具体的书籍内容,但基于标题、描述以及通常这类书籍会涉及的主题,我们可以总结出...

    C++高效编程:内存与性能优化(pdf版)

    《C++高效编程:内存与性能优化》是一本专注于C++编程语言内存管理和性能调优的书籍。本书深入探讨了如何在C++编程中高效地使用内存资源,以及如何进行性能优化,以编写出既高效又优雅的代码。 书籍作者Rene ...

    达梦数据库的性能优化收集.pdf

    达梦数据库性能优化 达梦数据库作为国产数据库市场占有率第一的高性能、高可靠性、高安全性、高兼容性大型关系型数据库管理系统,已经成功替代了Oracle,在电力、金融、电子政务、教育等行业领域得到了广泛的应用,...

    《Oracle数据库性能优化实践指南》PDF

    《Oracle数据库性能优化实践指南》是一本专注于Oracle数据库性能调优的专业书籍,旨在帮助读者深入理解和掌握如何在实际环境中提升Oracle数据库的运行效率。Oracle数据库是全球广泛使用的大型企业级数据库管理系统,...

    linux-Linux性能优化实战案例

    在《Linux性能优化实战》案例中,我们深入探讨了如何利用Linux系统工具和技术来提升系统的运行效率和性能。Linux作为一款开源操作系统,其强大的可定制性和丰富的工具集使其成为性能优化的理想平台。以下是一些核心...

    SQLServer性能优化与管理的艺术

    资源名称:SQL Server性能优化与管理的艺术内容简介:本书共15章,分为三部分,第一部分(第1-2章)为概述部分,阐述SQLServer方面的“性能”及相关概念。并给出常规的性能及性能相关的问题侦测的“方法论”,读者...

    mysql性能优化.pdf

    ### MySQL性能优化关键知识点 #### 一、MySQL简介与历史沿革 MySQL是一个开源的关系型数据库管理系统(RDBMS),最初由瑞典的MySQL AB公司开发。它的轻量级、高效性和低成本特性使其成为互联网上中小型网站的理想...

Global site tag (gtag.js) - Google Analytics