首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS积分除法

JS积分除法
EN

Stack Overflow用户
提问于 2021-10-09 12:16:02
回答 1查看 53关注 0票数 1

因为在Javascript中所有的数字都是double precision float,只是记忆表示或数值运算的问题,都是一样的吗?

例如,关于计算复杂性

代码语言:javascript
复制
15 / 3
14 / 3

这些操作是否会耗费相同的计算资源,或者v8是否会优化整数除法的情况?

EN

回答 1

Stack Overflow用户

发布于 2021-10-10 16:05:40

(这里是V8 developer。)

简而言之:,这很复杂!,而且(正如axiac指出的)也不值得担心。

长长的答案:

首先,当你的源代码中有一个像15 / 3这样的数字字面量的除法,那么V8将在解析时将其常量折叠,所以这个除法只会执行一次,而且无论它是否以任何方式进行了优化都无关紧要。例如,如果您编写function f() { return 15/3; },那么它将被编译成function f() { return 5; }

下一个重要的观察是,判断除法是否会有整数结果的唯一方法是实际执行除法并查看结果。具体地说,如果一个引擎想要像这样的东西:

代码语言:javascript
复制
function implementation_of_/_operator(x, y) {
  if (division_result_will_be_integer(x, y)) {
    return integer_division(x, y);
  else {
    return floating_point_division(x, y);
  }
}

然后它必须以某种方式实现division_result_will_be_integer,有两种选择:

代码语言:javascript
复制
function division_result_will_be_integer(x, y) {
  if (!is_integer(x) || !is_integer(y)) return false;
  return is_integer(floating_point_division(x, y));
}
// or:
function division_result_will_be_integer(x, y) {
  if (!is_integer(x) || !is_integer(y)) return false;
  (quotient, remainder) = integer_division_with_remainder(x, y);
  return remainder == 0;
}

显然,仅仅为了决定以后执行哪个额外的除法而执行除法是愚蠢的,而且跳过整个过程而直接进行浮点除法会更快。

第三个相关点是,用于整数除法的硬件指令可能相当慢。特别是,对于大的被除数和小的除数,它往往比浮点除法指令慢。因此,您的问题假设为“优化”,在实践中很可能会降低性能。

不管是整型域还是浮点域,除法总是相当昂贵的操作。在两个操作数都是整数的情况下,除法可以与除数的“乘法逆”进行replaced by multiplications。但是,再次找到这个乘法逆涉及除法,因此只有当您希望使用相同的除数执行多个除法时,这种技术才能提高性能--例如,当除数是常量时,例如f(x) { return x / 3; }。此外,对整数进行操作意味着只能表示整数结果;如果本例中有人调用f(14),那么乘法求逆技术将产生不正确的结果。

如果(1)除数是常量,(2)在优化给定函数时,V8在优化代码中使用此方法,则以前在此特定除法中生成的所有结果都是整数。这样的优化代码仍然必须包含一个检查,以验证所有未来的结果也是整数,即它必须检查该division_result * dividend === divisor,否则将跳出到浮点除法。

最后,还有一些对asm.js样式代码的特殊处理。如果您编写f(x, y) { return ((x | 0) / (y | 0) | 0); },那么V8将在该函数中使用整数除法指令。显然,|0操作意味着该函数将输入及其结果都截断为32位整数,这对于您的用例可能是可接受的,也可能是不可接受的。这是比普通的、简单的、无忧的function f(x, y) { return x / y; }快还是慢,还取决于您的用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69506638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档