使用乘法而不是逻辑AND

时间:2015-08-23 11:09:50

标签: performance logic

有没有理由为什么使用乘法而不是逻辑AND运算符是首选或不鼓励(使用任何编程语言)?下面的例子表明它可以使代码更简单,但是还有其他优点(或缺点)吗?

int x = 1;
int y = 0;
int z = 1;

int xyz_mult = x*y*z;
int xyz_and = ((x && y) && z);

以R:

中的简单示例为例
library(rbenchmark)
library(Rcpp)

benchmark(T*F*T, (T&&F)&&T, replications = 1e6)
##           test replications elapsed relative user.self sys.self user.child sys.child
## 2 (T && F) && T      1000000   2.974    1.000     2.965    0.004          0         0
## 1     T * F * T      1000000   3.201    1.076     3.187    0.008          0         0

和更快一点。但是使用Rcpp时,使用int变量可以获得更快的乘法效果,而bool变量可以(反直觉地)更快:

xyz_and_int <- cppFunction("
int foo() {
   int x = 1;
   int y = 0;
   int z = 1;
   return (x && y) && z;
}
")

xyz_mult_int <- cppFunction("
int foo() {
   int x = 1;
   int y = 0;
   int z = 1;
   return z*y*z;
}
")

xyz_and_bool <- cppFunction("
int foo() {
   bool x = 1;
   bool y = 0;
   bool z = 1;
   return (x && y) && z;
}
")

xyz_mult_bool <- cppFunction("
int foo() {
   bool x = 1;
   bool y = 0;
   bool z = 1;
   return z*y*z;
}
")

以下是模拟结果:

benchmark(xyz_and_int(), xyz_mult_int(), replications = 1e6)
            test replications elapsed relative user.self sys.self user.child sys.child
## 1  xyz_and_int()      1000000    3.32    1.000      3.33        0         NA        NA
## 2 xyz_mult_int()      1000000    3.34    1.006      3.33        0         NA        NA
benchmark(xyz_and_bool(), xyz_mult_bool(), replications = 1e6)
             test replications elapsed relative user.self sys.self user.child sys.child
## 1  xyz_and_bool()      1000000    3.36    1.015      3.34        0         NA        NA
## 2 xyz_mult_bool()      1000000    3.31    1.000      3.31        0         NA        NA

1 个答案:

答案 0 :(得分:0)

如果我没有弄错的话,可以使用移位寄存器或某种加法器进行乘法运算。它们的实现总是比AND门更复杂,因此它们的效率更低&#34;。