代码调优及其余zz

看了CoolShell最近的一篇文章《性能调优攻略》我这只把我比较感兴趣的代码调优部分贴出来留做备份,其余部分的调优策略能够点链接看原文。以前作的Api监控系统和天然语言的一个情感分析,都用到了海量数据的输入输出,对代码优化这里感触甚多,好比数据结构的选择,异常的处理方式,还有该文中说到的变量类型选择,多线程控制,在作这种数据量交换很大的模块时,这些方面就要好好去斟酌了。html

4.2)代码调优。从个人经验上来讲,代码上的调优有下面这几点:web

  • 字符串操做。这是最费系统性能的事了,不管是strcpy, strcat仍是strlen,最须要注意的是字符串子串匹配。因此,能用整型最好用整型。举几个例子,第一个例子是N年前作银行的时候,个人同事喜欢把日期存成字符串(如:2012-05-29 08:30:02),我勒个去,一个select  where between语句至关耗时。另外一个例子是,我之前有个同事把一些状态码用字符串来处理,他的理由是,这样能够在界面上直接显示,后来性能调优的时候,我把这些状态码全改为整型,而后用位操做查状态,由于有一个每秒钟被调用了150K次的函数里面有三处须要检查状态,通过改善之后,整个系统的性能上升了30%左右。还有一个例子是,我之前从事的某个产品编程规范中有一条是要在每一个函数中把函数名定义出来,如:const char fname[]=”functionName()”, 这是为了好打日志,可是为何不声明成 static类型的呢?
  • 多线程调优。有人说,thread is evil,这个对于系统性能在某些时候是个问题。由于多线程瓶颈就在于互斥和同步的锁上,以及线程上下文切换的成本,怎么样的少用锁或不用锁是根本(好比:多版本并发控制(MVCC)在分布式系统中的应用 中说的乐观锁能够解决性能问题),此外,还有读写锁也能够解决大多数是读操做的并发的性能问题。这里多说一点在C++中,咱们可能会使用线程安全的智能指针AutoPtr或是别的一些容器,只要是线程安全的,其无论三七二十一都要上锁,上锁是个成本很高的操做,使用AutoPtr会让咱们的系统性能降低得很快,若是你能够保证不会有线程并发问题,那么你应该不要用AutoPtr。我记得我上次咱们同事去掉智能指针的引用计数,让系统性能提高了50%以上。对于Java对象的引用计数,若是我猜的没错的话,处处都是锁,因此,Java的性能问题一直是个问题。另外,线程不是越多越好,线程间的调度和上下文切换也是很夸张的事,尽量的在一个线程里干,尽量的不要同步线程。这会让你有不少的性能。
  • 内存分配。不要小看程序的内存分配。malloc/realloc/calloc这样的系统调很是耗时,尤为是当内存出现碎片的时候。我之前的公司出过这样一个问题——在用户的站点上,咱们的程序有一天不响应了,用GDB跟进去一看,系统hang在了malloc操做上,20秒都没有返回,重启一些系统就行了。这就是内存碎片的问题。这就是为何不少人抱怨STL有严重的内存碎片的问题,由于太多的小内存的分配释放了。有不少人会觉得用内存池能够解决这个问题,可是实际上他们只是从新发明了Runtime-C或操做系统的内存管理机制,彻底于事无补。固然解决内存碎片的问题仍是经过内存池,具体来讲是一系列不一样尺寸的内存池(这个留给你们本身去思考)。固然,少进行动态内存分配是最好的。说到内存池就须要说一下池化技术。好比线程池,链接池等。池化技术对于一些短做业来讲(如http服务) 至关至关的有效。这项技术能够减小连接创建,线程建立的开销,从而提升性能。
  • 异步操做。咱们知道Unix下的文件操做是有block和non-block的方式的,像有些系统调用也是block式的,如:Socket下的select,Windows下的WaitforObject之类的,若是咱们的程序是同步操做,那么会很是影响性能,咱们能够改为异步的,可是改为异步的方式会让你的程序变复杂。异步方式通常要经过队列,要注间队列的性能问题,另外,异步下的状态通知一般是个问题,好比消息事件通知方式,有callback方式,等,这些方式一样可能会影响你的性能。可是一般来讲,异步操做会让性能的吞吐率有很大提高(Throughput),可是会牺牲系统的响应时间(latency)。这须要业务上支持。
  • 语言和代码库。咱们要熟悉语言以及所使用的函数库或类库的性能。好比:STL中的不少容器分配了内存后,那怕你删除元素,内存也不会回收,其会形成内存泄露的假像,并可能形成内存碎片问题。再如,STL某些容器的size()==0  和 empty()是不同的,由于,size()是O(n)复杂度,empty()是O(1)的复杂度,这个要当心。Java中的JVM调优须要使用的这些参数:-Xms -Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold,还须要注意JVM的GC,GC的霸气你们都知道,尤为是full GC(还整理内存碎片),他就像“恐龙特级克赛号”同样,他运行的时候,整个世界的时间都中止了。
 
 
相关文章
相关标签/搜索