《编程珠玑》 读书笔记

《编程珠玑》

读书笔记

娄雨禛 PB16060356

准确的问题描述

  很多时候,我们总是过度关注了解决问题所用的巧妙算法,而将问题本身的重要性忽视。当我们拿到一个问题时,应当反复研读问题的每一个细节,因为正是这些细节的细微偏差导致了我们在解决问题时方案与技巧的重大不同。

  如果我们只花很少的时间研读问题本身,而过度专注于问题的解决时,极有可能在百般忙碌之后,发现自己走了一大段弯路。所谓“舍本逐末”,或许说的就是这个道理吧。

数据决定程序结构

  程序语言是给人阅读的,程序的执行效率是由数据流的高效与否体现的。而横跨这两者之间的,便是程序结构。事实上,良好的程序结构能够非常好地同时达成上述两个目标,而基本的方法,就是让我们尊崇这么一个原则:数据决定程序结构

  这里有一些值得记录的注意点。

  出错信息

  混乱系统的数百个出错信息散布在出错代码中。同时,这些出错信息又和其他语句混杂在一起。而清晰系统则通过一个专用函数来访问这些出错信息。

  单词分析

很多计算机问题都是由英文单词的分析引起的。拼写检查器会使用“后缀去除”来精简词典,这是所有编程人员应当注意的。

  结构化数据

  最初,结构化数据就意味着选择恰当的变量名。后来,在程序员使用“平行数组”或寄存器偏移量的地方,编程语言加入了记录或结构以及指向它们的指针。指针的引入极大地优化了数据的传递和表达。我们在编程过程中也要尽量发挥指针操作的优越性。

代码调优法则

  代码调优大致有以下六条法则。

  空间换时间法则

  空间换时间在很多地方都见得到。比如,求斐波那契数列时,我们为了防止递归所产生的庞大计算量拖慢运行速度,往往将之前步骤的数据存储起来,以便后次调用。空间换时间的思想在今天尤为适用。随着储存空间的大幅增加,我们更追求速度的提升。

  时间换空间法则

  密集储存表可以通过增加储存和检索数据所需的时间来减小存储开销。

  循环法则

  将代码移出循环 与其在循环的每一次迭代中都执行一次某种运算,不如将其移到循环体外,只计算一次。

  循环展开 通过将循环展开,可以减少修改循环下标的开销,从而有效避免管道延迟,增加指令的并行性。

  删除赋值 如果内循环中很多开销来自普通的赋值,通常可以通过重复代码并修改变量的使用来删除这些赋值。

  消除无条件分支

  循环合并

  逻辑法则

  利用等价的代数表达式。如果逻辑表达式的求值开销太大,就将其替换为开销较小的等价代数表达式。

  过程法则

  打破函数层次。对于调用自身的函数,通常可以将其改写为内联版本并固定传入的变量来缩短其运行时间。

  表达式法则

  消除公共子表达式。如果两次对同一个表达式求值时,其所有变量都没有任何改动,那么,就应当储存第一次的变量值以取代第二次的求值。

原文地址:https://www.cnblogs.com/RainLou/p/8623760.html