Node竟然比Go还快???
发布于 13 天前 作者 meiwhu 1519 次浏览 最后一次编辑是 11 天前 来自 分享

无聊测试下计算速度。

Node

let x = 0
console.time('label')
for (let i = 0; i < 10000000000; i++) {
  x = i + i * i / 5
}
console.timeEnd('label')

执行结果:

PS D:\tests\tmp> node .\app.js label: 11681.500ms

Go

package main

import (
	"fmt"
	"time"
)

func main() {
	x := 0
	start := time.Now()
	for i := 0; i < 10000000000; i++ {
		x = i + i*i/5
	}
	end := time.Now()
	fmt.Println(end.Sub(start))

	fmt.Println(x)
}

PS D:\go\src\learn\playground> go run .\app.go 15.6571548s

黑人问号???


之前的循环不科学,这次来个科学点的

Node

let x = 1
console.time('label')
for (let i = 1; i < 1000000000; i++) {
  x = i * i / x
}
console.timeEnd('label')
console.log(x)

PS D:\tests\tmp> node .\app.js label: 5113.117ms 636619773.1729867

Go

package main

import (
	"fmt"
	"time"
)

func main() {
	var x float64 = 1

	start := time.Now()
	for i := 1; i < 1000000000; i++ {
		x = float64(i*i) / x
	}
	end := time.Now()

	fmt.Println(end.Sub(start))

	fmt.Println(x)
}

PS D:\go\src\learn\playground> go run .\app.go 4.3488428s 6.366197731729867e+08

这下Go快一些了,不过也快的很有限,😄

16 回复

不止呢,比c语言还快,不信你试试,我这里c语言要23秒,node也是11秒

@zengming00 别闹,编译型语言,这是连编译时间都算上了~ 你编译后再算一遍

我想起了贴吧一堆人争论0.999···到底等不等于1的故事。。。

c++ 用 -O 优化下编译这个循环会被优化掉几乎瞬间就结束了, js 快也是 turbofan 的运行时优化,其实这种很好预测的循环并不能代表更复杂的真实性能…

--- Raw source ---
(exports, require, module, __filename, __dirname) { let x = 0
console.time('label')
for (let i = 0; i < 1000000000; i++) {
  x = i + i * i / 5
}
console.timeEnd('label')

})

--- Optimized code ---
optimization_id = 1
source_position = 10
kind = OPTIMIZED_FUNCTION
stack_slots = 13
compiler = turbofan
Instructions (size = 320)
0xe4aff1057a0     0  55             push rbp
0xe4aff1057a1     1  4889e5         REX.W movq rbp,rsp
0xe4aff1057a4     4  56             push rsi
0xe4aff1057a5     5  57             push rdi
0xe4aff1057a6     6  48ba0000000076000000 REX.W movq rdx,0x7600000000
0xe4aff1057b0    10  e8eb60ecff     call 0xe4afefcb8a0  (Abort)    ;; code: BUILTIN
0xe4aff1057b5    15  cc             int3l
0xe4aff1057b6    16  4883ec10       REX.W subq rsp,0x10
0xe4aff1057ba    1a  488975b0       REX.W movq [rbp-0x50],rsi
0xe4aff1057be    1e  488b45d8       REX.W movq rax,[rbp-0x28]
0xe4aff1057c2    22  a801           test al,0x1
0xe4aff1057c4    24  0f85bd000000   jnz 0xe4aff105887  <+0xe7>
0xe4aff1057ca    2a  48bb0000000000ca9a3b REX.W movq rbx,0x3b9aca0000000000
0xe4aff1057d4    34  483bc3         REX.W cmpq rax,rbx
0xe4aff1057d7    37  0f8d4d000000   jge 0xe4aff10582a  <+0x8a>
0xe4aff1057dd    3d  493ba5e00c0000 REX.W cmpq rsp,[r13+0xce0]
0xe4aff1057e4    44  0f8662000000   jna 0xe4aff10584c  <+0xac>
0xe4aff1057ea    4a  488bd8         REX.W movq rbx,rax
0xe4aff1057ed    4d  48c1eb20       REX.W shrq rbx, 32
0xe4aff1057f1    51  83ebff         subl rbx,0xff
0xe4aff1057f4    54  0f8092000000   jo 0xe4aff10588c  <+0xec>
0xe4aff1057fa    5a  660f1f440000   nop
0xe4aff105800    60  81fb00ca9a3b   cmpl rbx,0x3b9aca00
0xe4aff105806    66  0f8d1e000000   jge 0xe4aff10582a  <+0x8a>
0xe4aff10580c    6c  493ba5e00c0000 REX.W cmpq rsp,[r13+0xce0]
0xe4aff105813    73  0f864e000000   jna 0xe4aff105867  <+0xc7>
0xe4aff105819    79  488bc3         REX.W movq rax,rbx
0xe4aff10581c    7c  83e8ff         subl rax,0xff
0xe4aff10581f    7f  0f806c000000   jo 0xe4aff105891  <+0xf1>
0xe4aff105825    85  488bd8         REX.W movq rbx,rax
0xe4aff105828    88  ebd6           jmp 0xe4aff105800  <+0x60>
0xe4aff10582a    8a  48b9f9311b99e2250000 REX.W movq rcx,0x25e2991b31f9    ;; object: 0x25e2991b31f9 <String[7]: console>
0xe4aff105834    94  48b80000000002000000 REX.W movq rax,0x200000000
0xe4aff10583e    9e  488b75b0       REX.W movq rsi,[rbp-0x50]
0xe4aff105842    a2  e879b5f5ff     call 0xe4aff060dc0  (LoadGlobalICTrampoline)    ;; code: LOAD_GLOBAL_IC
0xe4aff105847    a7  e8dce7dfff     call 0xe4afef04028       ;; soft deoptimization bailout 4
0xe4aff10584c    ac  48bb30817e0001000000 REX.W movq rbx,0x1007e8130
0xe4aff105856    b6  33c0           xorl rax,rax
0xe4aff105858    b8  488b75b0       REX.W movq rsi,[rbp-0x50]
0xe4aff10585c    bc  e83feae7ff     call 0xe4afef842a0       ;; code: STUB, CEntryStub, minor: 8
0xe4aff105861    c1  488b45d8       REX.W movq rax,[rbp-0x28]
0xe4aff105865    c5  eb83           jmp 0xe4aff1057ea  <+0x4a>
0xe4aff105867    c7  48895da8       REX.W movq [rbp-0x58],rbx
0xe4aff10586b    cb  48bb30817e0001000000 REX.W movq rbx,0x1007e8130
0xe4aff105875    d5  33c0           xorl rax,rax
0xe4aff105877    d7  488b75b0       REX.W movq rsi,[rbp-0x50]
0xe4aff10587b    db  e820eae7ff     call 0xe4afef842a0       ;; code: STUB, CEntryStub, minor: 8
0xe4aff105880    e0  488b5da8       REX.W movq rbx,[rbp-0x58]
0xe4aff105884    e4  eb93           jmp 0xe4aff105819  <+0x79>
0xe4aff105886    e6  90             nop
0xe4aff105887    e7  e874e7cfff     call 0xe4afee04000       ;; deoptimization bailout 0
0xe4aff10588c    ec  e879e7cfff     call 0xe4afee0400a       ;; deoptimization bailout 1
0xe4aff105891    f1  e87ee7cfff     call 0xe4afee04014       ;; deoptimization bailout 2
0xe4aff105896    f6  e883e7d7ff     call 0xe4afee8401e       ;; lazy deoptimization bailout 3
0xe4aff10589b    fb  e892e7d7ff     call 0xe4afee84032       ;; lazy deoptimization bailout 5
0xe4aff1058a0   100  e897e7d7ff     call 0xe4afee8403c       ;; lazy deoptimization bailout 6
0xe4aff1058a5   105  0f1f00         nop

@hyj1991 这个有优化我是知道的,请问你这个代码怎么弄出来的呀😊

吓的我赶紧点进来看看

以很快的速度崩馈

0.9999是浮点数,1是整数,怎么可能相等,连再储存器上的排列方式都不同

极端情况下,这种代码,编译器会把循环优化掉,只计算最后一次,因为代码的意思也就是只要取最后一次的值。

这种代码不能用来比较语言实际运行速度的,V8的jit的确很厉害,很多优化超过编译型语言了。

表示看不懂

跟编译优化有关

来自✨ Node.js开源项目精选

@hyj1991 @coordcn @vendar 我改了循环计算的内容,这样编译器会怎么优化呢?这次比较结果go并没有快很多

@hyj1991 优化代码是对应js的?

@meiwhu

jit做得变态的情况下,一些高频调用代码比编译型语言强都是正常的。luajit都能和C语言对刚了,更不要说go了。v8jit水平只会比luajit强,现在luajit不怎么维护了。

回到顶部