【发布时间】:2014-11-03 18:54:15
【问题描述】:
我有一个从比特流中读取大量数据的程序。我这样做的方式并不高效,因为在进行性能测试时,大部分时间都花在了read 函数上。
这是我的阅读功能:
uint32_t bitstream::read(bitstream::size_type n) {
uint32_t a = data[pos / 32];
uint32_t b = data[(pos + n - 1) / 32];
uint32_t shift = pos & 31;
a >>= shift;
b <<= 32 - shift;
uint32_t mask = (uint32_t)(((uint64_t)1 << n) - 1);
uint32_t ret = (a | b) & mask;
pos += n;
return ret;
}
如何进一步优化它?我的分析器说这个函数的大部分时间都花在计算 ret 上。
编辑:
关于内部,这就是我设置数据的方式:
bitstream::bitstream(const std::string &dat) : size( dat.size()*8 ) {
// data has the type std::vector<uint32_t>
data.resize((dat.size() + 3) / 4 + 1);
memcpy(&data[0], dat.c_str(), dat.size());
}
【问题讨论】:
-
您应该显示更多代码,
bitstream类内部的声明会很方便。 -
您是否尝试过您的函数的任何变体并比较结果?你可以用这样的东西替换你的函数体:
uint32_t ret = ((data[pos / 32] >> (pos & 31)) | (data[(pos + n - 1) / 32] << (32 - (pos & 31)))) & (static_cast<uint32_t>((static_cast<uint64_t>(1) << n) - 1)); pos += n; return ret;.. 这是你的函数的微优化,只有rettemp 变量。您还可以比较编译器生成的程序集,看看它可能为您做什么。
标签: c++ bit-manipulation