有效防止重复访问
Efficiently preventing duplicate accesses
我有一个语句,计算乘法累加运算,看起来像这样:
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());
另一种方法只是在代码中插入一堆条件跳转,这很容易最终比原始代码更昂贵。
相关文章:
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 用于随机数据访问的最有效文件类型
- 为什么可以将 std::unique_ptr* u1 <A>作为 u1[1000] 访问并且它仍然有效
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 访问包含P的有效索引时返回空格的C++字符串
- 缓存和访问数据库数据的有效方法?
- 有效防止重复访问
- C++数组超出范围访问以计算指针有效?
- 在C++中,获取/释放原子访问和结合围栏的放松访问之间有什么有效的区别吗
- 访问std::map中元素的最有效方法是什么
- 在连接语句中访问Qt信号的"有效载荷"
- 为什么离开作用域后仍然有对结构的有效访问
- 为什么通过string.h访问C++字符串类有效
- 如何有效地从该对象中包含的另一个对象访问对象字段/属性
- 有效的C++项目43知道如何访问模板化基类中的名称
- 将多维C++数组作为一个连续块(堆上)访问是否有效
- 如何使用 Windows API 正确检查对文件的有效读/写访问
- 可变模板类终止情况下的直接访问有效,但方便类访问无法编译