C++枚举使用的速度比整数慢吗?

Fez*_*vez 66 c++ performance enums profiling

这真的是一个简单的问题:

我正在编写Go程序.我应该用一个QVector<int>QVector<Player>哪个代表董事会

enum Player
{
    EMPTY = 0,
    BLACK = 1,
    WHITE = 2
};
Run Code Online (Sandbox Code Playgroud)

我想当然,使用Player而不是整数会更慢.但我想知道还有多少,因为我相信使用enum更好的编码.

我做了一些关于分配和比较玩家的测试(相对于int)

QVector<int> vec;
vec.resize(10000000);
int size = vec.size();


for(int i =0; i<size; ++i)
{
    vec[i] = 0;
}


for(int i =0; i<size; ++i)
{
    bool b = (vec[i] == 1);
}


QVector<Player> vec2;
vec2.resize(10000000);
int size = vec2.size();


for(int i =0; i<size; ++i)
{
    vec2[i] = EMPTY;
}


for(int i =0; i<size; ++i)
{
    bool b = (vec2[i] == BLACK);
}
Run Code Online (Sandbox Code Playgroud)

基本上,它只慢了10%.在继续之前还有什么我应该知道的吗?

谢谢!

编辑:10%的差异不是我的想象力,它似乎特定于Qt和QVector.当我使用std :: vector时,速度是一样的

Mat*_*lia 80

枚举在编译时完全解析(枚举常量作为整数文字,枚举变量作为整数变量),使用它们没有速度惩罚.

一般来说,平均枚举的基础类型不会大于int(除非你输入非常大的常量); 事实上,在§7.25中明确指出:

枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int 枚举器的值不能适合于intunsigned int.

您应该在适当的时候使用枚举,因为它们通常会使代码更易于阅读和维护(您是否曾尝试调试充满"幻数"的程序?:S).

至于你的结果:可能你的测试方法没有考虑你在"普通"机器上运行代码时的正常速度波动1 ; 您是否尝试过多次(100+次)运行测试并计算您的时间的平均值和标准差?结果应该是兼容的:均值之间的差异不应大于两个标准偏差的RSS 2的1或2倍(假设通常是波动的高斯分布).

您可以做的另一项检查是比较生成的汇编代码(使用g ++,您可以通过-S交换机获得它).


  1. 在"普通"PC上,由于其他任务正在运行,缓存/ RAM/VM状态,您有一些不确定的波动......
  2. Root Sum Squared,平方标准差之和的平方根.

  • 我被教导说魔法数字是法术工作安全的主要组成部分之一(等级3). (17认同)
  • 我目前正在一个充满魔力的系统上工作。'if(code.equals(“ A”)&amp;&amp; status.equals(“ T”)',依此类推。我们在逐步弄清枚举集的过程中慢慢地建立它们。 (2认同)
  • @Jay:那就是您通常在Daily WTF上看到的那种东西……可悲的是这种东西确实存在。`:(` (2认同)

Mar*_*tos 44

通常,使用枚举应该对性能完全没有区别.你是怎么测试的?

我自己就跑了.差异是纯粹的噪音.

刚才,我把两个版本编译成汇编程序.这是每个主要功能:

INT

LFB1778:
        pushl   %ebp
LCFI11:
        movl    %esp, %ebp
LCFI12:
        subl    $8, %esp
LCFI13:
        movl    $65535, %edx
        movl    $1, %eax
        call    __Z41__static_initialization_and_destruction_0ii
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

播放机

LFB1774:
        pushl   %ebp
LCFI10:
        movl    %esp, %ebp
LCFI11:
        subl    $8, %esp
LCFI12:
        movl    $65535, %edx
        movl    $1, %eax
        call    __Z41__static_initialization_and_destruction_0ii
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

基于微基准性能的任何陈述都是危险的.有太多外来因素扭曲了数据.

  • +1用于比较装配本身.证明两个程序具有相同的程序集取代了对基准程序的需求. (25认同)

Oli*_*rth 17

枚举应该不慢.它们被实现为整数.