CSAPP第五章小结

第五章小节

第五章中,主要讲各种优化技术,首先通过引入CPE的概念来量化各种优化方法得到的性能,从而给于我们更强的说服力。第二,作者指出优化的地方,什么地方应该优化,就是关键代码中的少数内部循环部分,这些部分耗用的时间通常是值得关注的。

两种优化技巧

作者举例说明了各种编码技巧对性能的提升,尤其印象深刻的,减少重复过程的调用和减少对存储器中的重复引用,可以获得非常不错的改善,比如

int i;
int *result = 0;
for( i = 0; i < strlen(str);i++)
{
    *result += *str++;
}
一 、减少过程调用

第一种改善方法是,减少过程的调用,这里的过程是strlen();

int i;
int *result = 0;
int len = strlen(str);
for (i = 0; i < len; i++)
{
    *result += *str++;
}

这样做的话,strlen()只会被调用一次,会提升一部分性能,接下来还有一个地方可以优化,那就是减少存储器应用。

减少存储器引用

示例如下:

int i = 0;
int *result = 0;
int len = strlen(str);
int temp = 0;

for(i = 0; i < len; i++)
{
    temp  += *str++
}

result += temp;

以上操作可以减少对result指向内存的引用,从而加快了性能,书上看到的效果是提升了两倍。

多路并行,多路展开

作者并没有就此止步,而是结合现代处理器流水线处理指令的结果,从而充分利用处理器的并行特性来优化 ,具体就是多路展开,多路并行,从而获得最佳效果。书中花了很大的篇幅来讲授了如何根据寄存器的变化来确定关键路径,从而更好地优化代码,说实话,这部分没怎么掌握。

GPOF工具帮助查找性能瓶颈

其次作者还提出了用性能剖析程序GPOF 来确定代码的性能瓶颈,从而找到最耗时的部分。

总结

最后作者说了这些优化技巧呢只能是第二层次的优化,第一层次的优化是设计好数据结构和算法,其次才是这些编码编码技巧。数据结构和算法没设计好,编码技巧再好也不能提高程序的性能。这里作者点明了数据结构和算法的重要性,与战略和战术的关系扯上了关系,战略错误,战术优秀也无济于事,而战略正确,而战术得当才能成功。

本章的有助于平时编写代码时,写出性能优异的代码,以及这些优化技巧比较有效的原因,所以还是很有收获的。

### CSAPP 第五章 课后习题 解答与解析 针对计算机系统结构和编程方面的深入理解,CSAPP第五章通常涵盖了存储层次结构的内容。这一章节对于缓存的工作原理、性能优化以及如何编写高效的程序有着详细的介绍。 #### 缓存工作原理分析 在讨论具体题目之前,了解缓存的基本概念至关重要。缓存是一种高速的小容量存储设备,位于处理器核心内部或靠近CPU的位置,用于临时保存频繁访问的数据副本,从而减少主存访问次数并提高整体执行效率[^1]。 #### 题目实例:计算命中率 考虑一道典型的关于缓存命中的问题:“假设有一个两路组相联映射的直接映射缓存(cache),共有8个block位置可用,每块(block)可以容纳4个字(word)。如果按照地址0x0C开始连续读取32个整数(int),请问会发生多少次cache miss?” 为了求解此类问题,需要掌握以下几点: - **Cache配置参数**:包括总行数、关联度、块大小等。 - **寻址方式**:确定tag bits, index bits 和 offset bits的数量。 - **替换策略**:LRU (Least Recently Used), FIFO (First In First Out) 或者其他算法的选择会影响最终的结果。 通过上述信息可得出结论,在给定条件下,当首次加载数据时会产生一次miss;之后由于局部性原理的作用,后续请求可能会命中已存在的缓存项,除非遇到新的页面边界导致再次发生缺失。 ```c // C代码模拟简单的直接映射缓存行为 #include <stdio.h> #define CACHE_SIZE 8 // Cache block数量 #define BLOCK_WORDS 4 // 每Block含有的Word数目 int cache[CACHE_SIZE][BLOCK_WORDS]; unsigned int tags[CACHE_SIZE]; void access(unsigned long addr){ unsigned int tag = (addr >> 5); unsigned int idx = ((addr << 27)>>29); if(tags[idx]!=tag || !tags[idx]){ printf("Miss\n"); // 更新Tag及相应Block内容... tags[idx]=tag; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值