枚举类在数组索引时的性能
Enum class performance when array indexing
我可以期待看到性能的打击在这个…
enum class myEnum {A,B,C};
myArray[(int)myEnum::A] = 123;
与此相比?
enum myEnum {A,B,C};
myArray[A] = 123;
我倾向于为类型安全使用新样式的枚举类,但不想以牺牲性能为代价。
这取决于用作索引的enum值在编译时是已知的还是作为变量传递的。
也就是说,myArray[(int)myEnum::A]
不会受到任何惩罚,但myArray[(int)e]
可能会受到惩罚,这取决于e
的物理表示(即,可能需要"扩展"它)。
另一方面,一个简单的扩展是一个微不足道的操作,不太可能出现性能问题:像分支预测(在条件中)和缓存这样的事情在大多数应用程序中(对于低级应用程序)更重要,在高级应用程序中,算法很重要。
注意:为了避免运行时场景中的扩展问题,您可以将myEnum
的基本类型定义为编译器算法所期望的自然类型,我认为ptrdiff_t
在这里是最合适的。它是一个大整数
当然,这最终取决于编译器,但很难理解为什么任何合理的编译器会在这两种情况下生成不同的代码。
我在Intel上用g++ 4.7.2测试过,它们编译成相同的汇编代码。
不,类型转换不太可能对性能有任何影响。
我希望不是,但这取决于编译器的实现。你为什么不两种方法都试试,然后计时呢?尝试一些不同的编译器优化设置,这样你就知道,当涉及到生产代码编译时,它不会有什么不同。
我怀疑会有任何用于强制转换的汇编指令,因为整个表达式(int)myEnum::A
可以在编译时求值。
但是,如果您真的想知道,可以编写一对示例程序,并通过转储反汇编和/或测量性能来分析它们。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 数组索引的值没有增加
- OpenMP阵列性能较差
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 递归列出所有目录中的C++与Python与Ruby的性能
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 大小相等但成员数量不同的结构之间的性能差异
- 重载元组索引运算符-C++
- 为什么constexpr的性能比正常表达式差
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- std::map 索引运算符与插入方法的性能
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 性能:在 ARR(允许平局)中查找最大值的索引
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- 具有相同索引的循环的性能
- 多次调用索引运算符的性能
- 枚举类在数组索引时的性能