加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

CPU通俗演义及代码级性能优化实例分析

发布时间:2019-07-26 16:08:29 所属栏目:Windows 来源:SunnyZhang
导读:副标题#e# 做任何事情要形成自己的方法体系,这样在做事情的时候才能游刃有余。前面文章我们简单介绍了一个简单的例子,说明了代码开发中应该如何保证程序的性能。今天我们将更加深入的介绍如何在代码层面提升程序的性能。并且我们总结为几种情况,这样在以

这种问题的原因在于程序代码结构不合理,导致过度使用计算资源。如果往高大上的说,那就是算法不行。比如下面两段程序,前一段程序在for循环的条件判断中有一个strlen调用,用于判断字符串的长度。而后一段代码则将strlen移到条件判断外面。

CPU通俗演义及代码级性能优化实例分析

如果字符串大的情况下,这两个程序的性能差异可能有百倍。这个主要是因为strlen函数其实是个循环判断,需要消耗大量的计算资源。

另外一种最为常见例子是关于排序算法的,比如冒泡排序的性能比快速排序差。因为两者计算量(时间复杂度)不同,所以算法的性能自然就不同。

2. 运算符合理选择

这部分也是针对计算资源消耗的优化。在介绍这部分内容之前,我们脑子里要有个概念。就是不同的运算(加减乘除)消耗的计算资源是不同的,其中加减、位运算和移位操作最低,可以认为是1,那么乘法则是3-4,而除法则大概是10-30左右。

了解上上面的内容之后,那我们在程序开发中就要尽量少用除法运算,因为它的性价比实在不高(太消耗计算资源)。有人可能会想怎么可能?有的时候就要用除法怎么办?下面我们看一个例子,这个例子是JDK中关于Hashmap的实现。

Hashmap是通过哈希表实现的,哈希表的概念这里就不啰嗦了。在查找或者存储的时候需要根据Key值取模,定位元素的位置。通常我们能想到的方法就是取模的运算符(计算量类似除法),但在Hashmap中却没有用取模运算符,而是用的位运算。这样,整个性能就会有十倍以上的提升,如下是它的代码。

  1. static int indexFor(int h, int length) { 
  2. return h & (length-1); 

3. 减少对内存的访问

通过前面的准备知识我们知道内存的访问比寄存器慢100倍,因此在写代码的时候尽量减少对内存的访问。那么怎么减少对内存的访问呢?我们仍然看一个例子,比如一个简单的累加运算(这个例子比较极端)。前者是通过全局变量存储累加和,而后者是通过局部变量。

CPU通俗演义及代码级性能优化实例分析

为了深入的了解两者差异,我们需要对程序进行反汇编,然后对比一下反汇编代码。对比上线代码可以看出前者每次计算都有访问多次内存(其中带圆括弧的汇编语句),而后者则将其转换成了寄存器访问。

虽然我们通常认为局部变量在函数栈中(内存空间),但实际上编译器在进行程序编译的时候会对代码进行优化,将局部变量优化为寄存器。因此,我们在实际开发的时候尽量使用局部变量,减少对内存的访问。

4. 减少对磁盘的访问

道理跟前面一个是一样的,还是那个存储金字塔。如果你的程序有很多对磁盘的访问,性能通常不会好到那去。通常的方法是使用内存作为缓存。在磁盘方面性能优化最经典的例子恐怕就是文件系统的页缓存了。也就是文件系统写入的数据不会马上写到磁盘,而是先写到缓存(内存)中。而读数据的时候则是通过预读机制提前将数据读入内存,文件系统从内存读数据,而不是从磁盘。由于内存的性能是机械磁盘的十万倍以上,因此文件系统的性能得以大大提高(这里有场景限制,我们后面再详细介绍)。

另外一个经典案例还是文件系统相关的,这个就是Linux的虚拟文件系统(VFS)。我们知道文件系统每个文件都对应着一个inode,而inode也是存储在磁盘上的。如果我们要打开一个文件,首先需要从磁盘找到inode,然后读取到内存,然后才能进行后续的读写操作。

在VFS中,在文件打开的时候,VFS会将inode放入一个内存中的哈希表中,而且在关闭文件的情况下并不释放。这样,当应用程序再次打开文件的时候就可以直接从内存找到该inode,而不用重新读磁盘了。

上面这些都是特例,大家要融会贯通,希望对大家的软件设计有所帮助。最后,性能优化本质,还是那一句话,尽量少的使用计算资源,尽量多的用金字塔顶部的部件存储要访问数据。

【编辑推荐】

  1. 原移动董事长:5G需要新的操作系统 功能要超过现有系统
  2. 深度操作系统 Deepin 15.11 发布
  3. Linux发展历史,能够与微软抗衡的操作系统
  4. iOS版Chrome浏览器迎来“信用卡扫描器”代码
  5. 面试官:线上服务器CPU占用率高如何排查定位问题?
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读