使用宏扩展的泛型:为什么指令缓存使用不佳?
Generics using Macro expansion: Why the poor use of Instruction cache?
Russ Cox(Go 核心开发人员)在他的 blog 泛型实现中提到了以下关于实现泛型的宏扩展 (C++) 方法 -
The individual specializations may be efficient but the program as a
whole can suffer due to poor use of the instruction cache
这几天我一直在想这个说法,但不明白背后的原因。这个假设背后有什么合理的理由吗?
我明白如果我们有 -
- 指令参考位置不佳
- 分支预测不佳。
宏扩展会导致这些吗?
更新:Go Generic Discussion Summary中的类似讨论。在这里,他们将 C++ 中使用的技术概括为 Type Specialization
模板的每个实例实际上都是一个单独的 class。如果你使用 std::vector<int>
和 std::vector<float>
你最终会得到向量实现的两个完整副本(大多数标准库试图将尽可能多的代码从向量移到基础 class 或私有实现 class 因为这个原因,但仍然存在一些重复)。使用(最多)两倍的代码,指令缓存将以两倍的速度填充。
Russ Cox(Go 核心开发人员)在他的 blog 泛型实现中提到了以下关于实现泛型的宏扩展 (C++) 方法 -
The individual specializations may be efficient but the program as a whole can suffer due to poor use of the instruction cache
这几天我一直在想这个说法,但不明白背后的原因。这个假设背后有什么合理的理由吗?
我明白如果我们有 -
- 指令参考位置不佳
- 分支预测不佳。
宏扩展会导致这些吗?
更新:Go Generic Discussion Summary中的类似讨论。在这里,他们将 C++ 中使用的技术概括为 Type Specialization
模板的每个实例实际上都是一个单独的 class。如果你使用 std::vector<int>
和 std::vector<float>
你最终会得到向量实现的两个完整副本(大多数标准库试图将尽可能多的代码从向量移到基础 class 或私有实现 class 因为这个原因,但仍然存在一些重复)。使用(最多)两倍的代码,指令缓存将以两倍的速度填充。