sailei1 / blog

1 stars 0 forks source link

你不知道的JS -性能与测试 笔记 #87

Closed sailei1 closed 4 years ago

sailei1 commented 4 years ago

从 JavaScript 主程序(或另一个 Worker)中,可以这样实例化一个 Worker:

var w1 = new Worker( "http://some.url.1/mycoolworker.js" );

这个 URL 应该指向一个 JavaScript 文件的位置(而不是一个 HTML 页面!),这个文件将 被加载到一个 Worker 中。然后浏览器启动一个独立的线程,让这个文件在这个线程中作 为独立的程序运行。 如果浏览器中有两个或多个页面(或同一页上的多个 tab !)试图从同一个文件 URL 创 建 Worker,那么最终得到的实际上是完全独立的 Worker。

在 Worker 内部是无法访问主程序的任何资源的。这意味着你不能访问它的任何全局变量, 也不能访问页面的 DOM 或者其他资源。记住,这是一个完全独立的线程。 你还可以通过 importScripts(..) 向 Worker 加载额外的 JavaScript 脚本:

// 在Worker内部
importScripts( "foo.js", "bar.js" );

这些脚本加载是同步的。也就是说,importScripts(..) 调用会阻塞余下 Worker 的执行, 直到文件加载和执行完成。 var w1 = new SharedWorker( "http://some.url.1/mycoolworker.js" ); 因为共享 Worker 可以与站点的多个程序实例或多个页面连接,所以这个 Worker 需要通过 某种方式来得知消息来自于哪个程序。

模拟 webworker JavaScript 的异步(不是并行)来自于事件循环队列, 所以可使用定时器(setTimeout(..) 等)强制模拟实现异步的伪 Worker

SIMD JavaScript 计划向 JavaScript 代码暴露短向量类型和 API。在支持 SIMD 的那些系统 中,这些运算将会直接映射到等价的 CPU 指令,而在非 SIMD 系统中就会退化回非并行 化的运算。

asm.js 描述了 JavaScript 的一个很小的子集,它避免了 JavaScript 难以优化的部分 (比如垃圾收集和强制类型转换),并且让 JavaScript 引擎识别并通过激进的优化运行这样 的代码。可以手工编写 asm.js,但是会极端费力且容易出错,类似于手写汇编语言(这也是其名字的由来)

性能测试 Benchmark.js

function foo() {
// 要测试的运算
}

var bench = new Benchmark(
    "foo test", // 测试名称
    foo, // 要测试的函数(也即内容)
     { ..})
bench.hz; // 每秒运算数
bench.stats.moe; // 出错边界
bench.stats.variance; // 样本方差

尾调用优化是 ES6 要求的一种优化方法。它使 JavaScript 中原本不可能的一些递归模式变 得实际。TCO 允许一个函数在结尾处调用另外一个函数来执行,不需要任何额外资源。这 意味着,对递归算法来说,引擎不再需要限制栈深度。