javascript - 在 JavaScript 中创建不带循环的范围总和

标签 javascript benchmarking

是否可以在 javascript 中创建范围总和而不使用循环?这是为了提高代码的速度。例如:

JavaScript 范围总和:

#!/usr/bin/env js60

var j = 0, k = 100000000 + 1
for(i = 0 ; i < k ; ++i) { j += i }
console.log(j)

ruby 范围总和:

#!/usr/bin/env ruby

puts (1..100_000_000_000_000_000_000_000_000_000_000_000).sum

基准:

  1. Java 脚本求和范围:
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.531s
user    0m0.519s
sys 0m0.011s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.514s
user    0m0.502s
sys 0m0.012s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ time js60 p.js 
5000000050000000

real    0m0.558s
user    0m0.531s
sys 0m0.027s
┌┄┄[sourav::archlinux]┈[/tmp]
└──╼⮚ 
  • ruby :
  • ┌┄┄[sourav::archlinux]┈[/tmp]
    └──╼⮚ time ruby q.rb 
    5000000000000000000000000000000000050000000000000000000000000000000000
    
    real    0m0.105s
    user    0m0.088s
    sys 0m0.017s
    ┌┄┄[sourav::archlinux]┈[/tmp]
    └──╼⮚ time ruby q.rb 
    5000000000000000000000000000000000050000000000000000000000000000000000
    
    real    0m0.122s
    user    0m0.121s
    sys 0m0.000s
    ┌┄┄[sourav::archlinux]┈[/tmp]
    └──╼⮚ time ruby q.rb 
    5000000000000000000000000000000000050000000000000000000000000000000000
    
    real    0m0.118s
    user    0m0.094s
    sys 0m0.023s
    ┌┄┄[sourav::archlinux]┈[/tmp]
    └──╼⮚ 
    

    如何才能像 JS 中的 Ruby 一样快速工作?

    最佳答案

    如果需要,您可以使用算法来计算范围之和。

    1 + 2 + 3 + 4 + ... + (x - 1) + x
    

    相当于

    x * (x + 1) / 2
    

    // Look at the result in the browser console, not the snippet console
    const sum = (n) => (n * (n + 1n)) / 2n;
    console.log(
      sum(
        100_000_000_000_000_000_000_000_000_000_000_000n
      )
    );

    我敢打赌这与 Ruby 所做的事情是一样的 - 它不会单独计算每个数字,而是使用求和算法。

    请注意 BigInt 的使用,因为 100_000_000_000_000_000_000_000_000_000_000_000 太大,无法在 Javascript 中精确表示为数字

    关于javascript - 在 JavaScript 中创建不带循环的范围总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58637744/

    相关文章:

    javascript - 从提交 Angular 6 获取 HTML 选择值和输入值

    javascript - 随机比较数组中的每个元素

    javascript - 使用 Chrome 控制台通过 RequireJS 访问 Knockout ViewModel

    php - 路径信息与 fnmatch

    javascript - 在 javascript 中测量 websockets 数据输入/输出的大小

    javascript - 从数组中删除重复项(理解代码)

    javascript - 单击另一个图像时检索图像源?

    linux - 对 linux Bash 脚本进行基准测试

    Ruby 基准测试模块 : meanings of "user", "system"和 "real"?

    mysql - Solr 与 MySQL 的自动完成性能对比