热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

《漫谈程序的效率和水平(二)》(2009/12/28)

上篇主要谈了提高程序效率要考虑满足用户的容忍度的问题,现在我们言归正传谈谈如何提高程序的效率问题。提高程序的效率涉及到计算机基础知识、涉及到编程经验、涉及到程序硬件环境和软件环境、涉及到资金成
 

上篇主要谈了提高程序效率要考虑满足用户的容忍度的问题,现在我们言归正传谈谈如何提高程序的效率问题。提高程序的效率涉及到计算机基础知识、涉及到编程经验、涉及到程序硬件环境和软件环境、涉及到资金成本和时间等各个方面。依我的经验提高程序效率要从以下几个方面入手:

一、             程序要简短

程序的效率本质是执行可执行代码(汇编指令)的次数。这一点是关键的关键,程序员一定要牢记心中。程序越简短,其可执行代码就越少,就越有效率(如果程序是串行操作的话)。因此,我们在编写过程化程序的时候,要尽量改进我们的算法,让语句最少,源程序语句减少可以导致可执行代码减少。

1) 不要编写一些不起作用的“废话”:例如,定义了不必要的变量,

2) 不要编写了不起作用的语句(有可能忘记注释掉的)。

3) 不要编写不可能出现各种例外的判断语句。

4) 不要编写能够一条语句能实现的功能非要用34条语句来实现。

5) 改进程序算法,改进算法其中最重要的一条,就是减少语句。

但是并不总是是程序短,时间就短。例如,我们可以编制3条导致死循环的语句。程序很短,但是时间确是很长。其根本原因就是虽然可执行代码行数很短,但是执行可执行代码次数是无穷的。

      记得在过去,有时候会把各自程序(相同功能)拿出来比一比,看谁的程序最短。那怕有一条语句的减少都是被认为很了不起。所以“惜墨如金”程序员必需时刻牢记。长此过往,程序员就会养成一个良好的习惯。

      我发现现在许多程序员,资源意识很淡漠,仿佛程序设计语言中所有资源都可以任意使用,不需付代价,不需要理由。这种挥霍性的编程是一个不好的习惯,它会严重影响程序的效率。

二、减少循环内操作

循环语句是影响程序效率最重要的原因之一,这里循环语句一个是指程序员自己编写的,另一个是指程序调用的函数中使用的循环语句。

1、 程序员编写的循环语句首先要尽可能减少循环次数,减少循环次数,可以减少程序运行时间。第二,尽量减少循环内无用的操作,能在循环外执行的语句,就在循环外执行,第三,尽量减少嵌套循环,因为循环中的循环是两循环次数相乘的关系。若有可能可以变嵌套循环为顺序循环,顺序循环是两循环次数相加。

2、 程序员要能知道自己调用的各种函数中可能出现的循环操作,通过参数,尽量避免循环次数的增加。例如查找子串函数,一定是包含循环操作的。程序员在使用这个函数的时候,一定要尽量减少被查找的字符串的长度,增加查找的字符串的长度。这样循环查找的次数就会减少。

三、充分利用内存

利用内存是提高程序效率的非常有效的方法,通过使用内存,我们可以缓存许多需要再加工的数据,无须进行I/O交换,这样就可以提高程序的效率了。另外,我们可以利用内存建立数据的索引,加快数据查询的速度,从而提高了程序效率。

四、减少I/O操作

很多情况下I/O操作是影响程序效率的最重要的原因,尤其是数据库大数据量操作更是明显。我们可以建立通过建立表分区、表索引的方式来提高数据操作效率,这些方法本质是都是通过减少I/O操作来获取操作效率的。

减少I/O操作有很多技巧和方法,但是无论哪种方法都是要把I/O操作减少到最低。

例如,我们要输出1000万条记录到一个文本文件。一般的做法是形成一条记录写一次文件。如果,我们能形成1000条记录后,写一次文件,那么我们只要写1万次就可以了(其实上写文件还是很复杂的,它跟系统写缓冲区大小和硬盘本身结构有关)。这样程序效率就会有很大的提高。

又例如,我们可以用低级文件打开放式代替流文件打开方式,这样效率会更快些。因为流处理最终还是要调用低级打开的。

五、提高调用效率

在程序中,我们大量地调用系统函数、调用自己写的函数、调用各种引用的函数。这些函数的运行时间我们是无法改变的。因此我们要提高程序效率,我们

1)可以考虑使用功能相同但是运行时间较短的函数。

2)我们还可以自己编写一些函数替代系统函数或引用的函数,因为自己编制的函数所考虑因素比较少,功能比较直接,不需要考虑很多例外情况,程序代码要比其他函数要少的多。

六、使用全程变量

全程变量的使用可以减少参数的传递所花费的时间。参数传递在可执行代码中是需要花上PUSH(压栈)和POP(出栈)时间的。

但是,我不提倡使用全程变量,如果使用全程变量不能大幅度提高效率的话,还不如不用。但是,如果能够大幅度提高效率的话,使用全程变量也不失一种方法。

 

当以上的努力还不能使得程序效率达到用户容忍度的时候,还可以从更高层面提高程序的效率:

一、提高硬件环境

    提高计算机的内存大小、提高CPU性能、提高I/O吞吐能力、提高网络吞吐能力等硬件性能都能够提高程序的运行效率。

二、选择更接近底层的程序设计语言

这个道理是不言而喻的。

三、采用多机分布并行处理

可以把处理内容进行多机、分布、并行处理,这样也可以大大提高程序效率。

以上方法会导致更高的企业成本,关键是企业要评估其性价比。

 

一般人认为程序效率高,程序的水平就高。但是,我们也看到为了提高效率,我们可能就会更多地使用全程变量,就会申请更多的内存,就有可能破坏程序的结构,这样程序的水平就会降低。一个好的程序不但外在要有好的效率,而且内在要有好的结构,要有最佳的内存效率比。高水平的程序一定是高效率的,但高效率程序并不总是高水平的。

   很多人会问还有没有其它提高程序效率的方法,我的回答是肯定的。例如我们可以在可执行程序中嵌入汇编程序,以提高程序的效率。但是,这不是常态的做法,程序员只要了解就行了。

   大部分程序员只会使用语言编写程序,但不知道这个源程序究竟是如何变成可执行代码、变成什么可执行代码,这些可执行代码的执行时间是长是短。因此,要从根本上提高程序的效率,需要程序员深懂源程序到可执行程序的过程,深懂编译原理、深懂汇编语言、深懂汇编中的系统调用。对于数据库而言,程序员要深懂数据库原理、深懂数据存放方式和数据查询方式,深懂数据库操作与I/O操作与内存的关系。而这些深懂是需要长时间编程积累的。这就是我为什么说程序效率的提高是无止尽的原因了。

这个话题内容太多,太细,我也无法深入去写,尤其是后半部分,写的匆忙,只能起抛砖引玉的作用了。

下篇:《大项目、小项目都是程序员成熟之道》


推荐阅读
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 作为一名程序员,从大学步入职场后,常常感受到一种难以言喻的空虚感。这种感觉或许源于对生活的不满、职业发展的瓶颈,或是日常琐事带来的压力。本文将深入探讨这种复杂的情感,并尝试寻找解决之道。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 深入理解Spring:Aware接口、异步编程与计划任务
    本文将带你深入了解Spring框架中的 Aware 接口、异步编程以及计划任务。通过具体示例和详细解释,帮助你掌握这些核心功能的实现原理和应用场景。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
author-avatar
秋秋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有