检查迭代器是否具有我们要在 C++ 中分配的值是否是明智的优化
Is it sensible optimization to check if an iterator has a value that we want to assign in C++
有一个类似的问题16114572不过我这里说的比较具体
请回答第 3 行的问题:
void change_head(map<K, V>& m, V const& value) {
auto head = m.begin();
if (head->second != value) // <--- Make sense?
head->second = value;
}
说,我们所知道的关于 V
的唯一信息是具有运算符 !=
并且它是 可复制的 。
但是,没有关于这些操作有多快的信息(copy 和 !=
)。
更新:
想象一下,我们正在建造一座图书馆。我们可能会假设平等比复制更快,但我不确定!这种优化值得吗?
My primary language is not C++, so I just want to know, what people from C++ world do.
Is it sensible optimization
除非您可以衡量改进,否则这根本不是优化。这只是看起来很优化的货物崇拜垃圾,就像跑得更快的条纹。
(这不是侮辱 - 每个人都容易希望他们的代码速度快,这通常会导致您编写 看起来 快的代码。解决方案是学习而不是相信外表,而不是养成正确分析代码的习惯)。
However, there is no information about how fast those operations are
除非有理由,否则不要编写额外的代码。
在这里,您没有任何理由相信较长的版本更正确或性能更好。我们唯一确定的是我们增加了一些认知开销(需要阅读更多代码)和测试和分支(或有条件的移动)。
我们应该被要求证明编写越来越复杂的代码是合理的——我们在这里不能这样做。 IME 这可能 比原始版本更糟 因为测试和分支溢出分支预测器,或者因为负载依赖性,或者因为额外的指令缓存压力.
编辑:
UPD: Imagine, we are building a library
如果您希望存储的东西可能复制起来非常昂贵但比较便宜,那么为值类型提供一个可选的包装器而不是烘焙会更容易将其放入您的容器中:
template <typename T>
class CheapCompareExpensiveCopy
{
T value_;
public:
using SelfT = CheapCompareExpensiveCopy<T>;
// usual constructors etc.
SelfT& operator=(SelfT const &other)
{
if (other.value_ != value_) {
value_ = other.value_;
}
return *this;
}
};
有一个类似的问题16114572不过我这里说的比较具体
请回答第 3 行的问题:
void change_head(map<K, V>& m, V const& value) {
auto head = m.begin();
if (head->second != value) // <--- Make sense?
head->second = value;
}
说,我们所知道的关于 V
的唯一信息是具有运算符 !=
并且它是 可复制的 。
但是,没有关于这些操作有多快的信息(copy 和 !=
)。
更新: 想象一下,我们正在建造一座图书馆。我们可能会假设平等比复制更快,但我不确定!这种优化值得吗?
My primary language is not C++, so I just want to know, what people from C++ world do.
Is it sensible optimization
除非您可以衡量改进,否则这根本不是优化。这只是看起来很优化的货物崇拜垃圾,就像跑得更快的条纹。
(这不是侮辱 - 每个人都容易希望他们的代码速度快,这通常会导致您编写 看起来 快的代码。解决方案是学习而不是相信外表,而不是养成正确分析代码的习惯)。
However, there is no information about how fast those operations are
除非有理由,否则不要编写额外的代码。
在这里,您没有任何理由相信较长的版本更正确或性能更好。我们唯一确定的是我们增加了一些认知开销(需要阅读更多代码)和测试和分支(或有条件的移动)。
我们应该被要求证明编写越来越复杂的代码是合理的——我们在这里不能这样做。 IME 这可能 比原始版本更糟 因为测试和分支溢出分支预测器,或者因为负载依赖性,或者因为额外的指令缓存压力.
编辑:
UPD: Imagine, we are building a library
如果您希望存储的东西可能复制起来非常昂贵但比较便宜,那么为值类型提供一个可选的包装器而不是烘焙会更容易将其放入您的容器中:
template <typename T>
class CheapCompareExpensiveCopy
{
T value_;
public:
using SelfT = CheapCompareExpensiveCopy<T>;
// usual constructors etc.
SelfT& operator=(SelfT const &other)
{
if (other.value_ != value_) {
value_ = other.value_;
}
return *this;
}
};