
面积换核心。

硬件线程与软件线程。


分支会影响预测,看看有什么优化方法。

CPU 内部是用广播的方式来实现缓存一致性。

两种内存架构。 1,UMA(统一内存架构) 2,ccNUMA(缓存一致的非统一内存架构)

函数调用约定,是ABI 用的一部分。


历史的 64 位技术。64位会用寄存器传参。

锁原理,实际上就是一个变量好像。因为赋值只需要一条指令,所以一条指令就是原子性的。
锁的原理就是用单条指令封装多条指令成 原子操作。操作是单条,还是多条,是从不同的角度来看的。

进程的数据布局。


多进程架构的缺点,增加 TLB跟缓存的未命中率。

注意内存排序指令。

并行编程的关注点,缓存,以及是否能扩展多个处理器。

编译器处理静态库的时候无法利用内联优化
Windows 不是用的位置无关的动态库方式,


延迟加载什么时候会失效。

如何提升数据读取性能。

a 跟 b 指向不同的内存。
优化技巧,让编译器能看到更多的代码。

移位 比 乘除更快。


编译优化还有一个 fast 宏。

跨文件优化,可能需要把两个文件 一起编译,也就是需要 gcc 同时编译两个文件,不能独立编译。

内联太多会导致程序代码太大,指令缓存命中率下降。 因此通常只内联有利于性能提示的函数,避免内联只会增加指令缓存需求量的函数。

第一次知道,原来可以配置反馈文件来收集程序的运行时信息。 然后把运行时信息再输出给编译器来优化性能。


解决别名的方法。

尽量不要手写汇编,应该适当使用编译器的标记。

容器技术,Solaris 的 Zone,FreeBSD 的 Jail。

两种虚拟化的技术方案。


流水线式的并行方法。

检查热点代码,可以用运行时配置文件。

Helgrind 可以检测数据争用。

注意 屏障函数。

无锁是通过更低级别的原子操作 CAS 实现的。C++ 的 automatic 应该就是通过 CAS 实现的。反汇编看一下。

__thread 关键字。

控制大多数线程到某个位置再一起往下跑。

注意 OpenMP。

编译器可以实现一定程度的并行化。

OpenMP 也可以用互斥锁。

弱内存排序。

操作系统提供了原子操作。

ABA 问题可以用版本号来解决。

快排的多线程实现。

内存优化。

