我有一条语句计算乘加运算,看起来像这样:
return A->set(A->get() + B->get() * C->get());
现在,A,B和C可能不是唯一的,我想最小化冗余get()
。我唯一能想到的优化方法是
if (A == B && B == C) {
double a = A->get();
return A->set(a + a * a);
} else if (A == B) {
double a = A->get();
return A->set(a + a * C->get());
} else if (A == C) {
double a = A->get();
return A->set(a + B->get() * a);
} else if (B == C) {
double b = B->get();
return A->set(A->get() + b * b);
} else {
return A->set(A->get() + B->get() * C->get());
}
有没有更有效的方法?将其概括为三个以上的参数呢?
答案 0 :(得分:2)
您可以将它们存储在地图中。该解决方案可以轻松扩展为任意多个指针,但是为了具体起见,这里我使用了三个。
std::unordered_map<MyType *, double> computed_values;
for (MyType *p: {A, B, C}) {
if (computed_values.find(p) == computed_values.end()) {
computed_values[p] = p->get();
}
}
double result = computed_values[A] + computed_values[B] * computed_values[C];
A->set(result);
正如其他人指出的那样,请确保对您进行配置,以确保这实际上值得进行std::unordered_map
查找的开销。
答案 1 :(得分:1)
假设get()
方法在产生可测量的性能差异方面确实非常昂贵,
double a,b,c;
a = A->get();
b = (B==A?a:B->get());
c = (C==B?b:(C==A?a:c->get()));
return A->set(a+b*c);
答案 2 :(得分:0)
假设get()方法相当便宜,那么最好还是这样做:
return A->set(A->get() + B->get() * C->get());
另一种方法只是将一堆条件跳转插入代码中,这很容易导致比原始代码昂贵。