对于一个程序员来说,程序的效率是一个不能忽视的问题,各种论坛上也充满了各种各样的关于效率的争论,这就不得不引起一种思考,一个程序的效率究竟取决于哪些因素呢?我们应该如何均衡效率问题和其他软件设计问题之间的利弊关系呢?这就是这篇文字想要讨论的问题。
首先,我们来看看,哪些因素左右了我们程序的效率,大致可以分为以下几个因素:
第一, 语言和平台:每一种语言都有自己赖以生存的平台环境,这关系到一个语言本身最根本的内部机制,比如java必须运行于JVM,.NET必须有CLR的支持,c\c++必须有支持该语言的编译器和各种库,这些属性就决定了他们对于CPU指令的操作距离,这样的距离越远,当然他们的编译出来的程序的运行效率就越低,拿x86系列来说吧,JVM是面向操作系统的。因此只要安装了对应的操作系统版本,java就能做到编译一次,任何地方都可以运行的目标,但是这里的运行自然是JVM面向操作系统的解释运行,如此一来速度自然快不了;CLR呢?他是面向windows系统的,他等于是“做入”了windows,在第二次JIT编译之后,他便可常驻系统,如此一来,他的速度在windows上自然会快一些,当然也因此失去了跨操作系统运行的能力(虽然理论上可行,但实际上非常不理想,有兴趣的人可以关注一下mono项目);c\c++则只要编译之后,基本上可以和CPU直接通话,效率自然是很高了,但是他们对硬件的依赖程度就大大增加,从而对程序员的要求也达到了新的高度。
第二, 数据结构和算法:语言通常只是一种表达工具,平台是你的工作环境,一般情况下,程序员并没有选择,那么自然他们只能在表达的内容上下一些功夫了,选择正确的数据结构,可以是程序的编写变得相当容易,而又不损失效率,ADT的思想可以使得我们摆脱数据具体存储的细节问题,我们可以知道二叉树、哈希表利于搜索,链表利于存储,向量利于随机等等,使得我们可以有效的组织内存空间来达到换取CPU效率的目的;算法的设计可以尽可能的减少CPU指令的数量,从而使问题的复杂度呈几个数量级的降低,比如数组的最大子序列问题,一般的设计,这样的问题会做成平方(O( N^3))甚至立方(O( N^2))的复杂度,然后通过动态规划和分治法等的重新设计,该问题可以在线性(O(N))复杂度里解决。好的算法可以使得处理海量数据的时间变得可以接受,同时又让内存的使用量控制在合理的范围内,这自然是很大的学问,这里不可能累述,我推荐去看各种专业书籍,比如《算法导论》。
第三, 库的使用:我们都知道技术问题的解决都是站在巨人的肩膀上完成的,很少有人什么都是自己做的,而且你设计的同样的算法和数据结构,往往并没专业库提供的效率高,原因自然是多方面的,比如一些针对编译器的优化,细节上的运算技巧等等,在因此库的选择成了左右程序的效率的另一个主要因素,当然这根本上还是对数据结构和算法的认识,无非就是无需去亲自实现罢了。
然后,我们必须明白,效率问题不是程序设计的唯一问题,甚至有时不是主要问题,尤其在CPU继续遵行摩尔定律在飞速更新的情况下,在一些非海量数据处理的程序里,效率问题并不是那么突出的,这里不是说效率问题不重要了,而是说效率问题和其他软件设计问题之间应该达到一种均衡,这里有如下几个问题:
第一、80-20法则,这是说,一个程序的20%的代码决定了这个程序80%的效率,举个很简单的例子,位运算比算术运算要快,因此位运算放在程序里的效率要高,但是这样的运算如果不是程序的核心处理,每次运行个一两次,这样的效率甚至可以忽略不计的,如果他处在程序的核心部份(也就是那20%的代码),每次运算个上百万次。优势当然就有所体现了,所以对效率的关注要有重点,不能面面俱到。
第二,移植性和通用性,这两个特点是软件界一直在追求的目标,对于移植来说,有些高效的设计往往是不可移植的(比如位运算在32位的CPU下和64位的CPU下的结果就未必相同),语言平台也同样如此,java的程序和c程序的移植性显然也是不可同日而语的;通用意味着代码的可维护性,高效的算法有时候是面对某些特殊的问题而设计,逻辑结构极其复杂,自然给后来的维护以及通用带来许多麻烦,这些问题要根据具体的情况加以均衡,其中使用各种通用程序库也是不错的解决方法之一。
无论如何,程序的效率依然是程序设计过程中一个非常重要的因素,因为CPU的发展速度还是远远落后于数据的处理量,但是凡事都不能过度,效率不是程序的唯一瓶颈,懂得均衡的设计才有可能是好程序。
分享到:
相关推荐
"程序效率分析在C语言程序设计教学中的应用" 本文探讨了程序效率分析在C语言程序设计教学中的应用,旨在提高教学效果。通过对程序效率的分析,可以提高学生对程序设计的理解和掌握,并且能够提高教学效果。 关键...
### C++编程程序效率简略说明 #### 一、C++与C语言的效率比较 自二十世纪七十年代C语言问世以来,它凭借其高度灵活性、高效性和良好的可移植性,迅速成为软件开发领域中不可或缺的一部分。C++作为C语言的继承与...
借此工具包,你将无需投入服务器、无需接口编程、无需开发后台,将传统开发小程序效率提升百倍微信小程序云开发工具包。借此工具包,你将无需投入服务器、无需接口编程、无需开发后台,将传统开发小程序效率提升百倍...
LabVIEW 是一款强大的图形化编程环境,用于创建各种应用程序,特别是在测试、测量和控制系统中。...提高LabVIEW程序效率的关键在于理解程序运行过程中的瓶颈,优化与外设、文件的交互,控制界面更新,合理设计
LabVIEW 是一款强大的图形化编程环境,用于创建各种应用程序,特别是在测试、测量和控制系统中。...提高LabVIEW程序效率的关键在于理解程序运行过程中的瓶颈,优化与外设、文件的交互,控制界面更新,合理设计
以下是一些常见导致程序效率低下的原因: 1. **读写外部设备和文件** - **外围设备限制**:相对于CPU和内存速度,外围设备如GPIB的数据传输速率较慢,这可能是整个系统效率低下的瓶颈。 2. **界面刷新与等待事件...
使用 profiler 可以避免盲目地寻找程序效率问题,使得优化工作更加有针对性。以下是如何利用 MATLAB 的 profiler 功能来提高程序效率的步骤: 1. **运行程序**: 在完成程序编写后,首先尝试运行程序,以验证其...
将数据暂存在缓冲区内,待达到一定量后再批量进行数据库操作,这样可以显著减少数据库交互次数,提高程序效率。 #### ESQL/C程序编译原理 ESQL/C程序是通过在C语言程序中嵌入SQL语句来实现的。在程序编译过程中,...
C 语言精髓之一就是强制转换的使用,恰当地利用强制转换可以提供程序效率,使程序更加简洁。例如,将带符号字节整型转换为无符号字节整型等。 6. 适当地使用算法 作为程序员的我们需要动脑筋,采用数学算法解决...
本文将详细介绍如何利用 MATLAB 的 Profiler 功能来提升程序效率。 Profiler 是一种调试工具,它可以帮助用户识别程序中的性能瓶颈,从而进行针对性的优化。首先,完成程序编写后,应先尝试运行程序,以验证其正确...
小程序 泵国标效率(学生必备)小程序 泵国标效率(学生必备)小程序 泵国标效率(学生必备)小程序 泵国标效率(学生必备)小程序 泵国标效率(学生必备)小程序 泵国标效率(学生必备)小程序 泵国标效率(学生...
总的来说,提升LabVIEW程序效率的关键在于理解程序的运行机制,识别性能瓶颈,并在设计阶段就考虑优化。通过合理地组织代码结构,减少不必要的计算和I/O操作,以及充分利用LabVIEW的特性,可以构建出更高效、响应更...
### C++程序设计-第6次实验指导:循环控制与程序效率 #### 实验目标: 本次实验的主要目标在于让学生熟练掌握并运用循环控制语句来解决实际问题,并且特别强调了程序的效率。 #### 关注焦点: - **程序效率**:在...
汇编语言编写,主程序采用键盘扫描方式执行该程序,因为未使用延时判断,程序效率很高(扫描一次最长只需26个机器周期,整个程序只有92个字节),节省了CPU的时间,为了避免按键按下后频繁执行该程序,本键盘扫描程序...
18. **性能优化**:内存管理、垃圾回收、缓存策略等提高程序效率的方法。 每个C#小程序都可能聚焦于以上某一个或多个知识点,通过分析和学习这些小程序,开发者可以加深对C#的理解,提升编程技能,并从中获取灵感,...
例如,学习如何利用寄存器减少内存访问,提高程序效率;或者学习如何编写高效的循环和条件判断,使代码更加精炼。 在实际应用中,汇编语言常用于系统级编程、设备驱动开发、实时系统、嵌入式系统等领域,因为这些...
MATLAB 程序优化是提高程序效率和性能的重要手段。本文介绍了一些 MATLAB 程序优化的技巧和实践经验,包括向量化操作、避免矩阵复制、预分配内存、使用向量化函数和利用并行计算。通过应用这些优化技巧,我们能够...
编码程序学习是一个涵盖广泛的主题,主要涉及程序设计语言的种类、特点、选择,以及编码风格和程序效率。在本章中,我们重点关注了这四个核心领域。 首先,程序设计语言被分为四大类:机器语言、汇编语言、高级语言...