无聊测试下计算速度。
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快一些了,不过也快的很有限,😄
不止呢,比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是整数,怎么可能相等,连再储存器上的排列方式都不同
@1316346949 呵呵
极端情况下,这种代码,编译器会把循环优化掉,只计算最后一次,因为代码的意思也就是只要取最后一次的值。
这种代码不能用来比较语言实际运行速度的,V8的jit的确很厉害,很多优化超过编译型语言了。
表示看不懂
跟编译优化有关
来自✨ Node.js开源项目精选✨
@hyj1991 优化代码是对应js的?
jit做得变态的情况下,一些高频调用代码比编译型语言强都是正常的。luajit都能和C语言对刚了,更不要说go了。v8jit水平只会比luajit强,现在luajit不怎么维护了。