有效防止重复访问

Efficiently preventing duplicate accesses

本文关键字:访问 有效      更新时间:2023-10-16

我有一个语句,计算乘法累加运算,看起来像这样:

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());
  }

有没有更有效的方法?将其推广到三个以上的参数怎么样?

您可以将它们存储在地图中。该解决方案可以很容易地扩展到任意多个指针,但我在这里使用了三个具体性。

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查找的开销。

假设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);

假设 get(( 方法相当便宜,你最好只做:

return A->set(A->get() + B->get() * C->get());

另一种方法只是在代码中插入一堆条件跳转,这很容易最终比原始代码更昂贵。