对于unsigned int类型的a,b,c,d,e,f,g有一个条件,如下所示:
if ((a > 0) and (b < a) and (c >= d))
{
return ((e < std::min(std::max(0, a - g), b)) and
(f < std::min(d, std::max(0, c - g))));
}
我正在寻找重构表达式的方法,使其更具可读性。
答案 0 :(得分:1)
首先,将这种低级优化保留给您的C ++编译器。可能最近调用的GCC g++ -Wall -O2 -march=native
将比public function scopeMatchingSearch($query, $string)
{
$query->where(function($q) use ($string) {
foreach (static::searchableFields() as $field) {
$q->orWhere($field, 'LIKE', '%'.$string.'%');
}
});
}
更好optimize。请参阅Matt Goldbolt的CppCon2017演讲:What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid。
如果您认为(在分析之后)应该手动优化此特定代码,请执行此操作并对其进行记录。但你应该首先介绍一下。
请注意各种近似timing的计算。
请记住,开发时间也有成本。大多数情况下,它们比这种低级优化更重要。因此,源代码的可读性也很重要(更好地命名变量,额外的临时值或其他注释可能很重要)。
答案 1 :(得分:1)
优化是错误的术语,但可以重写代码以找到更好的(更简化或简洁的业务)逻辑。
X < min(Y, Z) <=> X < Y and X < Z
X < max(Y, Z) <=> X < Y or X < Z (less usefull)
然后可能的重写是
return ((e < std::min(std::max(0, a - g), b)) and
(f < std::min(d, std::max(0, c - g))));
return ((e < std::max(0, a - g) and e < b)) and
(f < d and f < std::max(0, c - g))));
return (e < 0 or e < a - g)
and e < b
and f < d
and (f < 0 or f < c - g);
根据其他限制,这可能是可以减少的。
我宁愿为难以阅读的min + max。
创建一个函数between
return e < minmax(b, a - g, 0) and
f < minmax(d, c - g, 0);
我之间没有这样说,因为maxmin也是可行的。
<强> 加 强>
@Jarod向我指出,OP提到的所有数字都是无符号。然后max(a - g, 0)
可能应该是
a > g ? a - g : 0