【发布时间】:2010-06-09 15:42:55
【问题描述】:
我编写了一个函数,它读取字节的输入缓冲区并生成字的输出缓冲区,其中每个字可以是输入缓冲区的每个 ON 位的 0x0081 或每个 OFF 位的 0x007F。输入缓冲区的长度是给定的。两个阵列都有足够的物理位置。我还有大约 2Kbyte 的空闲 RAM,可用于查找表左右。
现在,我发现这个功能是我在实时应用程序中的瓶颈。它会被非常频繁地调用。您能否建议一种如何优化此功能的方法?我看到一种可能性是只使用一个缓冲区并进行就地替换。
void inline BitsToWords(int8 *pc_BufIn,
int16 *pw_BufOut,
int32 BufInLen)
{
int32 i,j,z=0;
for(i=0; i<BufInLen; i++)
{
for(j=0; j<8; j++, z++)
{
pw_BufOut[z] =
( ((pc_BufIn[i] >> (7-j))&0x01) == 1?
0x0081: 0x007f );
}
}
}
请不要提供任何库、编译器或 CPU/硬件特定的优化,因为它是一个多平台项目。
【问题讨论】:
-
你是怎么发现这个功能是瓶颈的?你用的是什么分析器?
-
@Sam:我没有使用任何分析器。问题是这个函数会在内部循环中被非常频繁地调用。
-
如果你没有使用过profiler,你不知道它是一个瓶颈。众所周知,人们不善于发现热点。此外,您是否知道实际的性能问题? “实时”意味着程序必须满足性能限制,而不是一切都必须尽可能快。
-
您可能会发现最快的代码将取决于平台。
-
@David Thornley:人们通常不擅长寻找热点,但在很多情况下并非所有人都如此,在某些情况下,大多数程序员只要在寻找热点就可以找到热点。以我的经验,如果编译器知道它们是持续操作,那么最难发现的热点涉及可能被提升到循环之外的东西。像
while( x < func(my_str) )这样的东西 my_str 没有改变,但编译器不知道或不知道func是纯的——func变得更热,但对所有程序员来说可能并不明显。
标签: c++ c performance algorithm bit-manipulation