对于一个程序员来说,程序的效率是一个不能忽视的问题,各种论坛上也充满了各种各样的关于效率的争论,这就不得不引起一种思考,一个程序的效率究竟取决于哪些因素呢?我们应该如何均衡效率问题和其他软件设计问题之间的利弊关系呢?这就是这篇文字想要讨论的问题。
首先,我们来看看,哪些因素左右了我们程序的效率,大致可以分为以下几个因素:
第一, 语言和平台:每一种语言都有自己赖以生存的平台环境,这关系到一个语言本身最根本的内部机制,比如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语言的继承与...
微信小程序云开发工具包,消耗工具包,你将消耗掉服务器、消耗接口编程、开发后台,将传统开发小程序效率提升百倍功能介绍微信小程序接口工具包,耗费服务器,耗费开发后台,开箱即用,轻松开发小程序交流QQ群:群1: ...
以下是一些常见导致程序效率低下的原因: 1. **读写外部设备和文件** - **外围设备限制**:相对于CPU和内存速度,外围设备如GPIB的数据传输速率较慢,这可能是整个系统效率低下的瓶颈。 2. **界面刷新与等待事件...
### 某知名企业程序代码编写规范之八:程序效率 #### 一、程序效率概述 在软件开发过程中,代码效率是衡量程序质量的重要指标之一。本文档旨在介绍某知名企业在程序代码编写规范中的第八部分——程序效率方面的...
总的来说,提升LabVIEW程序效率的关键在于理解程序的运行机制,识别性能瓶颈,并在设计阶段就考虑优化。通过合理地组织代码结构,减少不必要的计算和I/O操作,以及充分利用LabVIEW的特性,可以构建出更高效、响应更...
### C++程序设计-第6次实验指导:循环控制与程序效率 #### 实验目标: 本次实验的主要目标在于让学生熟练掌握并运用循环控制语句来解决实际问题,并且特别强调了程序的效率。 #### 关注焦点: - **程序效率**:在...
在内存管理中,将程序的不同部分,包括代码、数据段、堆(Heap)、栈(Stack)等,按照一定的策略进行分配和组织,是提高程序效率、降低内存使用冲突的关键。操作系统中,动态链接器与加载器负责将程序映射到内存...
本文将详细介绍如何利用 MATLAB 的 Profiler 功能提升程序效率。 首先,当编写好一个程序后,我们应对其进行测试运行,以确认其正确性和性能。在 MATLAB 的主界面中,选择 "Desktop" 菜单,然后选择 "Profiler" ...
汇编语言编写,主程序采用键盘扫描方式执行该程序,因为未使用延时判断,程序效率很高(扫描一次最长只需26个机器周期,整个程序只有92个字节),节省了CPU的时间,为了避免按键按下后频繁执行该程序,本键盘扫描程序...
18. **性能优化**:内存管理、垃圾回收、缓存策略等提高程序效率的方法。 每个C#小程序都可能聚焦于以上某一个或多个知识点,通过分析和学习这些小程序,开发者可以加深对C#的理解,提升编程技能,并从中获取灵感,...
例如,学习如何利用寄存器减少内存访问,提高程序效率;或者学习如何编写高效的循环和条件判断,使代码更加精炼。 在实际应用中,汇编语言常用于系统级编程、设备驱动开发、实时系统、嵌入式系统等领域,因为这些...
MATLAB 程序优化是提高程序效率和性能的重要手段。本文介绍了一些 MATLAB 程序优化的技巧和实践经验,包括向量化操作、避免矩阵复制、预分配内存、使用向量化函数和利用并行计算。通过应用这些优化技巧,我们能够...
理解并行执行的概念,可以提升你的程序效率。 9. **控件和函数库**:LabVIEW拥有庞大的内置函数库,涵盖了各种功能。通过例程,你可以探索和熟悉这些库,找到解决问题的工具。 10. **自定义VI和函数**:除了内置...
通过这些算法的介绍,本书旨在帮助读者提升程序效率,特别是在处理大量数据时的性能优化。 7. 求根和非线性方程组的解法,包括各种迭代方法,例如牛顿法、割线法等。这些方法允许解决没有解析解或解析解难以求得的...
常量字KW主要用于存储固定的数值或数据,它们在程序中的使用能够提高程序效率,优化内存使用,减少程序扫描时间,使代码更加简洁易读。本文将探讨如何在通讯程序中巧妙运用常量字KW。 首先,常量字KW可以有效地用于...
多线程允许程序并行执行,从而实现异步操作,提高程序效率。 2. **Win32 API线程创建**:在Win32 API中,可以使用`CreateThread`函数创建新的线程。这个函数接收函数指针和参数,被创建的线程会从指定的函数开始...