全栈A同学:
Sky:我们从构建一个通用的benchmark(性能基准测试)方法开始,切入点要小💥此方法我们希望做到以下几点
在meeko核心库中
const benchmark = function benchmark ( fn = function () { /* do nothing */ }, // 传入的函数 msg = '', // 需要打印的信息 n = 1000000 // 默认执行 100万次) { const t = performance.now() // 取更精确的时间 let everyTime = 0 let timeSpend = 0 // 总执行时间 let dt = 0 // 每次执行时间差 let minDt = Infinity // 最大执行时间差 let maxDt = -Infinity // 最小执行时间差 for (let i = 0; i < n; i++) { everyTime = performance.now() fn() // 此处不执行传参,可以自行优化 dt = performance.now() - everyTime timeSpend += dt minDt = dt < minDt ? dt : minDt // 记录每次最小时间差 maxDt = dt > minDt ? dt : maxDt // 记录每次最大时间差 } const diffTime = timeSpend const spendTime = diffTime.toFixed(0) // 总时差取整 const perSec = (((n / diffTime) * 10000) / 10000) | 0//每毫秒执行次数取整 console.log( c.y((fn.name || '').fillStr(' ', 15)), //彩色打印函数名,占15字符 (spendTime + ' ms').fillStr(' ', 8, -1), //打印总耗时,右对齐 ((perSec + '').toMoney() + ' /ms').fillStr(' ', 10, -1), n.toExponential() + ' 次', //打印每毫秒次数并千分位隔开,右对齐 ( '±' + (((maxDt - minDt) / 2 / (spendTime / n)) * 100).round(2) + '%' ).fillStr(' ', 9, -1), //打印执行时间的稳定性百分比,右对齐 msg //打印信息 )}
上效果图
大家会常用 obj[prop] 模式,可尝试 key in 方式
推荐使用includes,但indexOf依旧强大
推荐使用find模式
推荐使用delete
推荐直接使用+,除非对性能要求较高
不递归解题对程序猿算法要求很高,递归可以降低逻辑复杂度
去重直接上ES6 模式,没问题!
这里确实没有想到,reduce表现极其优秀😄
唯一ID,分布式的基础
这些也是我们每天都在打交道的代码更多基础测试代码查看
WebAssembly成为W3C标准,应该无人不知了。WebAssembly大致就是用C/C++之类的语言编译成.wasm文件,直接被js调用执行😶出bulit-in函数外,普遍性能的提升在50%以上😶
直接上Emscripten
git clone https://github.com/juj/emsdk.gitcd emsdkemsdk install latestemsdk activate latest# on Linux or Mac OS Xsource ./emsdk_env.sh# on Windowsemsdk_env.bat
以上完成安装Emscripten安装😄
先上一个js的 斐波那契数列,使用我们的benchmark函数
const $ = require('meeko')function fib (n) { if (n < 2) { return 1 } return fib(n - 2) + fib(n - 1) // 最暴力写法,可以极大的优化}const fibJs = () => { fib(20)}$.benchmark(fibJs, 'fibJs', 100000) // 运行10万次// fibJs 7536 ms 13 /ms 1e+5 次 ±15.79% fibJs 有点慢,每毫秒只有13次,但js同学表示无能为力了
上C语言的斐波那契数列实现
#include <stdlib.h>#include <stdio.h>#ifdef __EMSCRIPTEN__#include <emscripten.h>#endifint fibonacci(int n, int a, int b){ if (n <= 2) { return b; } return fibonacci(n - 1, b, a + b);}long EMSCRIPTEN_KEEPALIVE fib(int n){ return fibonacci(n, 1, 1);}
emcc -s WASM=1 fib.c -o fib.js 将c编译成wasm,加入胶水层引入js 上图
What? 同样是递归每毫秒webassembly 3.5k次
emcc -s WASM=1 -O3 fib.c -o fib.js 加入编译优化上图
What? 没看错又提高了3倍,比JS提高833倍😶
最后看一下JS与webassembly性能比较代码作为2020年程序员们工作的开始🔥
/*斐波那契数列js和webassembly c 比较*/const $ = require('meeko')// 引入meeko核心库let cModule = require('./fib.js') // 引入wasm胶水层js代码function fib (n) { if (n < 2) { return 1 } return fib(n - 2) + fib(n - 1) // 最暴力写法,可以极大的优化}const fibJs = () => { fib(20)}cModule.onRuntimeInitialized = function () { const fibC = () => { cModule._fib(20) // 导出的c函数有个_下划线 } $.benchmark(fibC, 'fibC', 100000)}$.benchmark(fibJs, 'fibJs', 100000)
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。