确定给定数字集中的任何一个数字是否为零的最有效方法是什么?

时间:2017-02-22 06:38:28

标签: c++ c

在我的项目中,只有当特定集合中的一个或多个数字为零时,我才必须执行某些操作。我希望这个检查是有效的,并且不想执行多个AND操作。

e.g。如果在获得最终答案之前我需要执行10个元素

<div>http://www.google.com</div>

这是汇编代码的样子(?)。

有没有更好的解决方案呢?

2 个答案:

答案 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;。