热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

04效率(Efficiency)效率

我怀疑可曾有人针对C软件开发人员,进行俄国生理学家Pavlov(巴甫洛夫)的著名实验。否则谁能够解释,为什么当效率这个字眼被

我怀疑可曾有人针对 C++软件开发人员,进行俄国生理学家 Pavlov(巴甫洛夫)的著名实验。否则谁能够解释,为什么当效率这个字眼被提起的时候,一大堆程序员就开始流口水?(译注:Pavlov,1849~1936,1904年诺贝尔生理学暨医学奖得主。他最著名的实验就是:狗一看到肉就“条件反射”地流口水。)

效率是件严肃的事情。程序如果太庞大或太迟缓,不论它的功能多么强大,都难以被用户接受。的确应该如此,毕竟软件是用来帮助我们把事情做得更好,而我们很难说愈慢代表愈好,或说 32MB 内存需求量比 16MB 更好,或说 100MB 磁盘空间需求量比 50MB 更好。此外,虽然某些程序之所以变得更大,消耗更多内存,是为了实现规模宏大雄心勃勃的计算能力,但也有太多程序,其庞大的身躯和迟缓的脚步必须归咎于不良的设计和懒散草率的编程习惯。

以 C++撰写高效程序,应该先认清一点,那就是 C++有可能对你原已存在的性能问题无能为力。如果你想写出一个高效的 C++程序,首先你必须能够写出一个高效程序。太多开发人员漠视此简单的事实。是的,循环可以手动展开,乘法可利用移位(shift)运算代替,但如果你所使用的高阶算法天生效率不彰,任何微调都影响不了大局。你可曾在线性算法适用的场合中,使用二次算法?你可曾一再计算相同数值?你可曾让“降低昂贵运算的平均成本”的机会飘然而逝?如果是,你不应该惊讶你的程序被视为次级景点——虽然值得一看,但还是等有多余的时间再说吧。

本章以两个角度对“效率”主题发动攻击。第一个角度和程序语言无关,其相关讨论适用于任何程序语言。针对书中所列的观念,C++有一个极佳的实现媒介:由于它对封装(encapsulation)的强力支持,我们有可能将低效率的 class 实现品以相同接口但拥有较佳算法和数据结构的新产品取代。

第二个角度和 C++本身有强烈关系。高性能算法和数据结构虽然很棒,但是草率的实现过程却会严重降低其影响力。最阴鸷险恶的错误就是“产生和销毁过多对象”,这不但容易形成,而且不容易被辨识出来。多余对象的构造动作和析构动作像是程序性能的大出血,每次一有非必要的对象被产生和被销毁,便流失宝贵的CPU 时间。这个问题在 C++程序中是如此普遍,我特别为它贡献 4个各自独立的条款,分别描述非必要的对象究竟来自何处,以及如何消除它们而又不损害程序的正确性。

程序变大和变慢,并不只因为产生太多对象。高性能道路上的其他坑坑洞洞还包括程序库的选用及语言特性的施行。以下各条款中,我也会讨论到这些题目。

读过本章内容之后,你将对改善性能的数个原则(几乎适用于任何程序)有所熟悉,你将确切知道如何阻止非必要的对象在程序中蔓延,对于编译器如何产生可执行文件,也会有更敏锐的了解。

有人说预先注意就是预先武装。若是如此,请把以下信息视为战斗前的准备。






推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
Leilani-lysbp_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有