确定来自给定数字集的数字中的任何一个的最有效方法是零

what is the most efficient way to determine if any one of the number from given set of numbers is zero?

本文关键字:数字 有效 方法 任何一      更新时间:2023-10-16

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

例如。如果有10个元素,我需要在获得最终答案之前执行操作后执行操作

var_and= A1 && A2;
var_and=var_and && A3;..
.
.
var_and=var_and && A10;

这是(?)的组装代码。

有更好的解决方案吗?

最有效的方法是最明确的

std::any_of(v.begin(),v.end(),[](int x) { return x==0; });

一些编译器甚至可以对其进行矢量化,因此很难进一步优化它。

,但这里最重要的是,您要节省可能会浪费时间来计算汇编指令(甚至几乎没有意义)以及代码潜在读者的时间。

完成整个程序后,您可以对其进行介绍并确定瓶颈。在不太可能的情况下,这一行是其中之一,您必须弄清楚到底发生了什么 - 缓存错过,IO,错误的分支预测 - 并解决该特定问题。

另一个接近选项是

std::find(v.begin(),v.end(),0)!=v.end(); 

要指出的第一件事是"最有效"是在情人眼中。你是说最快吗?最小的代码空间?最简单的维护?

如果您的编译器和硬件支持向量操作,我会说取集合的产品,如果它等于零,您知道至少一个元素为零。

所以也许我错过了一些东西 - 以下内容似乎太简单了 - 但是这会做您想要的吗?

bool has_a_zero(int *values, int n) {
  while (n--) {
    if (!*values++) return true;
  }
  return false;
}

如果不够快,您可以做一些技巧,例如一次进行循环以一次进行n个测试(例如Duff的设备)。或者,如果您的一组值具有带外值,则可以使用它来终止循环而不是操纵额外的寄存器。

但是,尽管如此,您需要更多地解释"最有效"的含义。