在我的项目中,只有当特定集合中的一个或多个数字为零时,我才必须执行某些操作。我希望这个检查是有效的,并且不想执行多个AND操作。
e.g。如果在获得最终答案之前我需要执行10个元素
<div>http://www.google.com</div>
这是汇编代码的样子(?)。
有没有更好的解决方案呢?
答案 0 :(得分:4)
最有效的方法是最明确的
std::any_of(v.begin(),v.end(),[](int x) { return x==0; });
有些编译器甚至可以对其进行矢量化,因此很难进一步优化它。
但最重要的是,你节省的时间可能会浪费在计算汇编程序指令(几乎没有意义)和潜在读者代码的时间上。
完成整个程序后,您可以对其进行分析并确定您的瓶颈。在不太可能的情况下,这一行是其中之一,你将不得不弄清楚到底发生了什么 - 缓存未命中,IO,错误的分支预测 - 并修复了这个特定的问题。
另一个关闭选项是
std::find(v.begin(),v.end(),0)!=v.end();
答案 1 :(得分:2)
首先要指出的是&#34;效率最高的&#34;是在旁观者的眼中。你的意思是最快吗?最小的代码空间?最容易维护?
如果您的编译器和硬件支持向量运算,我会说取该集的乘积,如果它等于零,您知道至少有一个元素为零。
所以也许我错过了一些东西 - 以下看起来似乎太简单了 - 但这会做你想做的吗?
bool has_a_zero(int *values, int n) {
while (n--) {
if (!*values++) return true;
}
return false;
}
如果这还不够快,你可以做一些技巧,例如展开循环来一次做N个测试的块(例如Duff's Device)。或者,如果您的值集具有带外值,则可以使用它来终止循环,而不是操纵额外的寄存器。
但是,实际上,你需要更多地解释一下你的意思&#34;效率最高&#34;。