性能函数调用与乘以 1
Performance function call vs multiplication by 1
看看这个函数:
float process(float in) {
float out = in;
for (int i = 0; i < 31; ++i) {
if (biquads_[i]) {
out = biquads_[i]->filter(out);
}
}
return out;
}
biquads_
是 std::optional<Biquad>[31]
.
在这种情况下,我检查每个可选项以检查它是否不为空,然后调用 biquad 的过滤函数,如果相反,我无条件地调用过滤函数,将其更改为乘以 1 或简单地 return输入值,会更有效率吗?
很可能它不会产生任何差异(虽然你的问题不完全清楚,但有点猜测)。出于两个原因:1) 除非代码将在 非常 热路径中使用,否则即使一种方式比另一种方式快几纳秒也没关系。 2)您的编译器优化器很可能足够聪明,可以生成在两种情况下执行接近(如果不相同)相同的代码。你测试了吗?你 benchmark/profile 了吗?如果不;这样做 - 启用 优化。
努力编写清晰、可读、可维护的代码。稍后当您确实遇到问题并且您的探查器将您的函数指向热点时,请担心微优化。
看看这个函数:
float process(float in) {
float out = in;
for (int i = 0; i < 31; ++i) {
if (biquads_[i]) {
out = biquads_[i]->filter(out);
}
}
return out;
}
biquads_
是 std::optional<Biquad>[31]
.
在这种情况下,我检查每个可选项以检查它是否不为空,然后调用 biquad 的过滤函数,如果相反,我无条件地调用过滤函数,将其更改为乘以 1 或简单地 return输入值,会更有效率吗?
很可能它不会产生任何差异(虽然你的问题不完全清楚,但有点猜测)。出于两个原因:1) 除非代码将在 非常 热路径中使用,否则即使一种方式比另一种方式快几纳秒也没关系。 2)您的编译器优化器很可能足够聪明,可以生成在两种情况下执行接近(如果不相同)相同的代码。你测试了吗?你 benchmark/profile 了吗?如果不;这样做 - 启用 优化。
努力编写清晰、可读、可维护的代码。稍后当您确实遇到问题并且您的探查器将您的函数指向热点时,请担心微优化。