【发布时间】:2008-09-29 03:30:14
【问题描述】:
从我过去看到的情况来看,StackOverflow 似乎喜欢编程挑战,例如收到数十条回复的fast char to string exercise problem。这是一个优化挑战:采用一个非常简单的函数,看看你是否能想出一个更聪明的方法。
很长一段时间以来,我一直想进一步优化一个函数,但我总是发现我的优化存在一些漏洞,导致输出不正确——在一些罕见的特殊情况下它们会失败。但是,鉴于功能,我一直认为应该能够做得比这更好。
该函数采用输入数据流(从熵的角度来看,实际上是随机位)并将其包装到 NAL 单元中。这涉及放置转义码:00 00 00、00 00 01、00 00 02 或 00 00 03 的任何字节序列都将替换为 00 00 03 XX,其中 XX 是原始序列的最后一个字节。正如人们可以猜到的那样,考虑到这种序列的可能性,这些仅在每 400 万字节的输入中放置大约 1 个 - 所以这是一个挑战,一个人搜索大量数据并且几乎什么都不做它除非在极少数情况下。然而,因为“做某事”涉及插入字节,它使事情变得有点棘手。当前未优化的代码如下C:
src 和 dst 是指向字节数组的指针,end 是指向输入数据末尾的指针。
int i_count = 0;
while( src < end )
{
if( i_count == 2 && *src <= 0x03 )
{
*dst++ = 0x03;
i_count = 0;
}
if( *src == 0 )
i_count++;
else
i_count = 0;
*dst++ = *src++;
}
此函数的常见输入大小范围约为 1000 到 1000000 字节的数据。
我最初的想法包括一个函数,它(以某种方式)快速搜索输入以查找需要转义码的情况,以避免在不需要放置转义码的绝大多数输入中出现更复杂的逻辑。
【问题讨论】:
标签: c performance optimization