13 More Effective C++—条款18(超前分期计算)

13 More Effective C++—条款18(超前分期计算),第1张

概述本文章向大家介绍13 More Effective C++—条款18(超前分期计算),主要包括13 More Effective C++—条款18(超前分期计算)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 超前分期计算

若程序经常用到,某个需要大量计算的值,那我们不如就直接将这个值算出来。比较典型的例子是,在读取一堆数字的时候,顺便把平均值、最大值、最小值都算出来。比如:

class Data {

public:

double max();

double min();

voID readData();

........

private:

double m_max,m_min;

}

这种方式(暂存数据:称为cache)之所以能够节省时间,是因为,如果所读取的数据集很大,并且其不经常变化,那我们每次获得像max,min的值,免去遍历整个数据集的工作,提高程序运行效率。

但是,如果数据集经常变化,这种方式不会带来太大改善。

2 应用

这种方式主要针对如下场景:

1,获取某个结果,需要进行大量计算;或者,进行一次 *** 作很费时间——如IO *** 作。


2,并且,涉及到的数据,不经常变化。

满足以上两个要求,这种方法才真正适用。

3 数据库访问

饭店为了提高顾客就餐体验,每个包间会起一个十分别致的名字。每个包间名唯一对应一个编号。

包间名称,房间号


因为包间名称和房间号基本无变化,且数据库查询 *** 作会启用IO,响应时间过长。因此,可以一次性将房间名和房间号读入内存缓存,直接访问内存查询。

房间号和房间名一 一对应,因此可以采用bi-direct-order map,即键值可以互查——key可以查询value,value可以查询key。

4 预获取(pre-fetch)

1 std::vector的预先分配策略

“超前分期计算”重点在于“超前”。因此,各种 *** 作,都可以通过牺牲存储容量来换取时间——在程序无法进一步优化的前提下,不可能空间和时间效率都有提高。

比如,如果没有预先分配内存计数,std::vector就会在每次插入数据时,进行如下 *** 作:

1,重新分配更大的内存


2,将原有数据拷贝到新的内存空间


3,插入新数据

显然,这样做效率很低。


实际上,在每次std::vector使用容量达到上限后,会分配原来的两倍内存,后面即便再插入数据,也不会进行上面的复杂动作。

2 内存的预先分配策略

计算机中,按照访问速度,由快到满排序是:高速缓存 -> 内存 -> 磁盘。容量由小到大排序是:高速缓存 -> 内存 ->磁盘。因此,cpu会优先读取高速缓存中的数据。

每个进程包含程序指令和数据,占用存储空间。为了加速运行,进程会取出一些当前用不到的数据,放到内存和高速缓存中——空间交换时间。

但是,如果进程占用空间过多,线程总数过多,就会导致数据频繁在内存和磁盘之间交换,程序执行速度反而下降。我们采用“缓存命中率(cache hit rate)”来描述一段时间内,真正用到的数据与存储中实际用到的数据之比。

缓存命中率 = (真正用到的数据) / (在内存中的数据,或者告诉缓存中的数据)

总结

以上是内存溢出为你收集整理的13 More Effective C++—条款18(超前分期计算)全部内容,希望文章能够帮你解决13 More Effective C++—条款18(超前分期计算)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1264559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存