Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环内使用Math.pow()和Math.floor()调用简化函数_Javascript_Performance_Loops_Pow_Floor - Fatal编程技术网

Javascript 在循环内使用Math.pow()和Math.floor()调用简化函数

Javascript 在循环内使用Math.pow()和Math.floor()调用简化函数,javascript,performance,loops,pow,floor,Javascript,Performance,Loops,Pow,Floor,如何简化以下函数和对Math.pow()的重复调用 函数x(a、b、c){ rv=数学楼层(a*数学功率(2,b)); 对于(i=1;i

如何简化以下函数和对
Math.pow()的重复调用

函数x(a、b、c){
rv=数学楼层(a*数学功率(2,b));
对于(i=1;i
如果您担心计算大范围的所有1.2^(b+i),请考虑底层可能会从编译器优化中的前一层推断出结果。然而,如果你想明确地帮助他,你可以这样做

function x (a, b, c) {
  var rv = Math.floor(a * Math.pow(2, b))
  var multiplier = Math.pow(1.2, b + 1)
  for (i = 1; i < c; i++) {
    rv += Math.floor(a * multiplier);
    multiplier *= 1.2
  }
  return rv;
}
函数x(a、b、c){
var rv=数学楼层(a*数学功率(2,b))
var乘数=数学功率(1.2,b+1)
对于(i=1;i

只是数学。

根据您问题中的标记,我假设您希望提高代码的性能

这里有一些您可以使用的技术,或多或少按它们将给您的代码带来的性能增益排序,第一个除外,但我鼓励您在代码中逐个实现它们,并查看它们如何单独影响其性能

✏️ 基本要素: 首先,正如在一篇评论中所建议的,您应该使用局部变量而不是全局变量,因此在它们前面添加
let

这样做的原因可能是可以忽略的,但这并不是改变它的唯一原因:使用globals被认为是一种不好的做法,因为它们污染了全局名称空间,使代码更难维护:

⛓️ 记忆指数: 不必在每次迭代中执行
Math.pow(1.2,b+i)
,您可以使用上一次迭代计算当前迭代值,因为乘法应该比幂运算快得多:

let exp = Math.pow(1.2, b);

for (let i = 1; i < c; ++i) {
    exp  *= 1.2;
    rv += Math.floor(a * exp);
}
let exp=Math.pow(1.2,b);
for(设i=1;i
这种技术被称为


“简化”是什么意思?更好的性能?首先,您没有在一个好的范围内声明变量。它们都是隐式全局变量,没有使用var、let或const(let和const现在是标准)您可以使用
a**b
而不是
Math.pow(a,b)
那里没有HTML或HTML5。他是一个新用户。请不要在不解释如何改进问题位运算符而不是
Math.floor
while
循环的情况下否决投票。@Bergi我完全同意
while
Math.trunc()
,但由于该操作在一个循环中执行多次,
~
仍然提供了一个不错的增益(
30%
更快),在我看来,如果该函数正常情况下执行循环的次数足够多,这样做是完全值得的。
let exp = Math.pow(1.2, b);

for (let i = 1; i < c; ++i) {
    exp  *= 1.2;
    rv += Math.floor(a * exp);
}