我正在尝试优化以下代码,这是我的应用程序中的瓶颈.它的作用:它取双值value1和value2并试图找到最大值,包括一个校正因子.如果两个值之间的差值大于5.0(LUT按比例10缩放),我可以取这两个值的最大值.如果差值小于5.0,我可以使用LUT的校正因子.
有没有人知道这段代码有什么更好的风格?我不知道我在哪里浪费时间 - 是大量的ifs还是乘以10?
double value1, value2;
// Lookup Table scaled by 10 for (ln(1+exp(-abs(x)))), which is almost 0 for x > 5 and symmetrical around 0. LUT[0] is x=0.0, LUT[40] is x=4.0.
const logValue LUT[50] = { ... }
if (value1 > value2)
{
if (value1 - value2 >= 5.0)
{
return value1;
}
else
{
return value1 + LUT[(uint8)((value1 - value2) * 10)];
}
}
else
{
if (value2 - value1 >= 5.0)
{
return value2;
}
else …Run Code Online (Sandbox Code Playgroud) 我的解决方案(对于输入块的每一位,都有这样一行):
*parity ^= (((x[0] >> 30) & 0x00000001) * 0xc3e0d69f);
Run Code Online (Sandbox Code Playgroud)
所有类型均为uint32。该行获取输入 x 的第二位,将其移位到 LSB并将所有其他位设置为零。然后,将 32 位奇偶校验与该位的相应奇偶校验集进行异或。
我发现这个乘法解决方案是执行条件异或的最快方法。有更快的方法吗?
我只是习惯了使用std :: auto_ptr的智能指针.
假设我想用auto_ptr和普通指针调用一个函数.
auto_ptr<uint32> data_smart(new uint32[123])]);
uint32 data_fix[123];
uint32* data_dumb = new uint32[123];
processData(data_smart);
processData(data_fix);
processData(data_dumb);
Run Code Online (Sandbox Code Playgroud)
没有超载的最佳做法是什么?使用带有uint32*参数的processData函数?我可以使用.get()将智能指针强制转换为uint32*吗?或者我应该怎么做?提前致谢!
我正在尝试并行化以下函数(伪代码):
vector<int32> out;
for (int32 i = 0; i < 10; ++i)
{
int32 result = multiplyStuffByTwo(i);
// Push to results
out.push_back(result);
}
Run Code Online (Sandbox Code Playgroud)
当我现在并行化for循环并将push_back部分定义为关键路径时,我遇到的问题是(当然)结果的顺序并不总是正确的.如何使线程运行在for循环的最后一行以正确的顺序执行代码?谢谢!