《编程珠玑》读书笔记2

18、关键在于简单性:简单性可以产生功能性、健壮性以及速度和空间;简单性也可以减少代码的空间。以下是几种数据空间技术:
    a.不要保存,重新计算。无论什么时候,在我们需要某一对象时,我们都不保存它,而是对它进行重新
计算,那么保存该对象所需的空间可以急剧地减少。如,一个素数表将被一个检索素数函数所取代。此方法牺牲更多的运行时间来获得更少的空间。这种方法只适用于待存储的对象可以从其描述中重新计算时的情形
,因为这样可以通过已经保存的较少的可描述某对象的信息中重建或重新生成该对象,而无需保存整个(较大)对象。
    b.稀疏数据结构。
    c.数据压缩。信息理论告诉我们,通过压缩的方式编码对象可以减少空间。如,通过整数 c=10 * a + b,将两个十进制数字a和b编码在一个字节中。该信息可以通过以下两个语句进行解码:
        a = c / 10
        b = c % 10
    d.分配策略。通过在需要时才分配记录的方式动态分配记录可以避免预先分配而未完全使用的浪费现象。动态分配显示,在需要什么东西之前,我们不必请求那些东西;可变长度记录的策略告诉我们当我们确定需要请求某样东西时,我们应该根据需要量的多少来申请。
    e.垃圾回收。回收废弃的内存之后,那些旧的位就又像新的一样了。如堆排序算法重叠了两个逻辑数据结构,它们在不同的时间应用于相同的物理存储位置。虽然现代计算机系统都有很在的内存,但为了提高性能,需要使用系统高速缓存,这样,又需要减少代码和数据所占的空间了。

19、编码空间技术。有时空间的瓶颈不在于数据,而在于程序本身的大小。下面是几乎用于减少代码空间的几种通用技术。
    a.函数定义。通过用函数替换代码中的公共模式简化了程序,因而也就减少了它的空间需求,并增加了其清晰性。使系统维护起来更加简单,同时也减少了空间。如微软将整个Windows系统向下压缩为更加紧凑的window CE所使用的技术。
    b.解释器。如用较少字节的解释器命令去替换硬编码到程序中长的文本数据,可以有效地减少程序所占用的空间。
    c.手工将代码转换成机器语言或汇编语言,但这种方式很少有人使用,只在内存非常宝贵的系统中才使用。

20、空间压缩的原则
    a.空间成本是否很高
    b.空间中的“热点”。正如程序的运行时间通常聚集在一些热点上:即代码中的少量部分经常要占用大部分的运行时间,数据也同样具有热点:少数常见类型的记录经常要占用大部分的内存。
    c.度量空间。使用性能监视器对程序运行时的内存使用情况进行观察,以了解程序是否存在对内存的不合理使用或过度使用以及内存泄漏的情况。
    d.权衡。有时必须权衡放弃性能、功能性或可维护性以获得内存,这一类工程决策只适用于在所有可选办法都研究过之后才能作出。无论何时,在我们权衡放弃任意希望得到的特性之前,我们都应该寻找各种技术,努力改善我们解决方案中的方方面面。
    e.和环境协作。编程环境对于程序的空间效率具有重要的影响。重要部分包括编译器和运行时系统所使用的表示方式、内存分配策略以及分页策略。
    f.使用合适的作业工具。

21、编程原则:
    a.理解观察到的问题。和用户讨论问题出现的环境。通常问题描述中就包含了解决方法的基本思想;just as usual, 必须考虑这些方法,但是不能排除其他的解决方法。
    b.指定一个抽象问题。一个简洁、明确的问题描述能够帮助我们在解决这个问题的基础上,进一步考虑如何将这个解决方法应用到其他问题上。
    c.利用设计空间。好的做法是宁愿思考一小时,编码一小时,而不是思考一分钟,编码一天。可以使用非正式的高级语言来描述设计:伪代码代表控制流,抽象数据类型代表关键的数据结构。这在设计过程阶段非常重要。
    d.实现解决方法。通过研究空间有时可以发现某个程序比其他的要好;而有时则只好从较好的几个解决方法中选择最好的。尽量使用简单直白的代码实现选中的设计,使用可用的最强大的操作
    e.回顾。回顾编程对于深入理解问题并寻到更有效的解决办法非常有用。
    f.多花几分钟时间来寻找一个简单的程序往往能节省几个小时编写复杂程序的时间。

22、有关存储分配和递归:
    a.在具有更高效率的分配器的不同系统中,消除递归能够将加速系统变为5。类似于很多代码优化技巧,缓存和递归消除有时会带来很多好处,但是有时却没什么用处。

23、实现查找算法的原则
    a.库的作用。C++标准模板库提供了一个很容易实现、维护及扩展的通用解决方案。当面临的问题涉及到数据结构时,第一个反应应该是去查找解决问题的通用工具。
    b.空间重要性。顺序访问内存可以极大地提高效率,因为这样可以充分利用CPU缓冲
    c.代码优化技巧。最大的改进就是通过单独分配一个大块来替换通用内存分配。这消除了很多昂贵的调用,并能高效地利用空间。通过重写递归函数,将它变成迭代函数,可以有效地提高运行速度和减少空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值