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枚举器的值不能适合于int或unsigned int.
您应该在适当的时候使用枚举,因为它们通常会使代码更易于阅读和维护(您是否曾尝试调试充满"幻数"的程序?:S).
至于你的结果:可能你的测试方法没有考虑你在"普通"机器上运行代码时的正常速度波动1 ; 您是否尝试过多次(100+次)运行测试并计算您的时间的平均值和标准差?结果应该是兼容的:均值之间的差异不应大于两个标准偏差的RSS 2的1或2倍(假设通常是波动的高斯分布).
您可以做的另一项检查是比较生成的汇编代码(使用g ++,您可以通过-S交换机获得它).
Mar*_*tos 44
通常,使用枚举应该对性能完全没有区别.你是怎么测试的?
我自己就跑了.差异是纯粹的噪音.
刚才,我把两个版本编译成汇编程序.这是每个主要功能:
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)
基于微基准性能的任何陈述都是危险的.有太多外来因素扭曲了数据.
| 归档时间: |
|
| 查看次数: |
6513 次 |
| 最近记录: |