【发布时间】:2012-10-09 11:40:27
【问题描述】:
通过 callgrind 运行我的应用程序发现,这条线比其他所有内容都相形见绌约 10,000 倍。我可能会围绕它重新设计,但这让我想知道;有没有更好的方法?
这是我目前正在做的事情:
int i = 1;
while
(
(
(*(buffer++) == 0xffffffff && ++i) ||
(i = 1)
)
&&
i < desiredLength + 1
&&
buffer < bufferEnd
);
它在一个 32 位无符号整数数组中寻找期望长度 0xffffffff 值的第一块的偏移量。
它比我想出的任何涉及内部循环的实现都要快得多。但是还是太慢了。
【问题讨论】:
-
可以优化的一点是该行的可读性...
-
您是否尝试过使用
std::search_n-std::search_n(buffer, bufferEnd, desiredLength, 0xffffffff)?我想它可以(潜在地)利用 SIMD。 -
假设连续
0xffffffff的最小数量至少为 2,使用 64 位整数并在循环后进行一些小修正,您可以将速度提高一倍。 -
你不能跳过desiredLength而不是1,然后从那里搜索吗? IE。如果 desiredLength 为 10,并且 buffer[0] 和 buffer[10] 都不匹配,则不需要查看 buffer[3]。
-
为了更进一步地使用 64 位整数的想法,您还可以使用 128 位 SSE。
标签: c++ c performance algorithm profiling