在 JavaScript 中的并行语言特性-周爱民在JavaScript中的 并行语言特性 周爱民 @aimingoo https://github.io/aimingoo 上海南潮信息科技有限公司/ruff.io R/W {range} {range} {range} R W Lock Unlock 声明一个变量/标识 符,使之在确定的上 下文中占有存储位 置。 有变量 1 使存储位置中有值。 绑定值 30 码力 | 41 页 | 8.61 MB | 1 年前3
2019-2021 美团技术年货 前端篇CODE A BETTER LIFE 【前端篇】 前端 | 2021 1 让 Flutter 在鸿蒙系统上跑起来 1 FlutterWeb 在美团外卖的实践 14 FlutterWeb 性能优化探索与实践 36 设计稿(UI 视图)自动生成代码方案的探索 56 美团外卖终端容器无关化研发框架 74 一款可以让大型 iOS 工程编译速度提升 50% 的工具 96 从预编译的角度理解 中的实践 459 开源 React Native 组件库 beeshell 2.0 发布 473 React Native 在美团外卖客户端的实践 506 Android 静态代码扫描效率优化与实践 530 Probe:Android 线上 OOM 问题定位组件 560 活动 Web 页面人机识别验证的探索与实践 580 React Native 工程中 TSLint 静态检查工具的探索之路 差异,但由于组件库在各端的实现不尽相同,很难做到完美的一致性体验。 1.1.2 提升多端迭代效率 由于各端技术体系的不同,涉及多端的需求往往需要不同的开发、测试团队各自完成 开发、联调、测试、上线等流程,占用资源巨大,在各团队不可并行支持的情况下, 前端 < 15 甚至可能导致整个业务交付周期被拉长。虽然 React Native、Flutter 等跨平台方案 解决了一部分复用的问题,但显然在商家端业务场景下是远远不够的,我们的目标是0 码力 | 738 页 | 50.29 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.5 重识搜索算法 . . . 时间效率:算法运行时间的长短。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大的局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能表现。比如一个算法的并行度较高,那 么它就更适合在多核 CPU 上运行,一个算法的内存操作密集,那么它在高性能内存上的表现就会更好。也 就是说,算法在不同的机器上的测试结果可能是不一致的。这意味着我们需要在各种机器上进行测试,统计0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.1.0 JavaScript版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.0.0 JavaScript版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样我们才能将各种算法进行对比,从而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。0 码力 | 375 页 | 30.68 MB | 1 年前3
阮一峰 JavaScript 教程的标准还在快速进化中,并不断合理化,添加更适用的 语法特性。 (2)支持编译运行。 JavaScript 语言本身,虽然是一种解释型语言,但是在现代浏览器 中,JavaScript 都是编译后运行。程序会被高度优化,运行效率接 近二进制程序。而且,JavaScript 引擎正在快速发展,性能将越来 越好。 此外,还有一种 WebAssembly 格式,它是 JavaScript 引擎的中 间码格式,全 书栈(BookStack.CN) 构建 3. } 单纯从上面的代码块,根本无法判断 x 到底是全局变量,还是对 象 obj 的一个属性。这非常不利于代码的除错和模块化,编译器也无 法对这段代码进行优化,只能留到运行时判断,这就拖慢了运行速度。 因此,建议不要使用 with 语句,可以考虑用一个临时变量代 替 with 。 1. with(obj1.obj2.obj3) { 2. console eval 的本质是在当前作用域之中,注入代码。由于安全风险和 不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用。通常 情况下, eval 最常见的场合是解析 JSON 数据的字符串,不过正确 的做法应该是使用原生的 JSON.parse 方法。 前面说过 eval 不利于引擎优化执行速度。更麻烦的是,还有下面这种 情况,引擎在静态代码分析的阶段,根本无法分辨执行的是 eval0 码力 | 540 页 | 3.32 MB | 10 月前3
阮一峰 《ECMAScript 6入门》 第三版Point(); p // { x: 0, y: 0 } 除了简洁,ES6 的写法还有两个好处:首先,阅读代码的人,可以立刻意识到哪些 参数是可以省略的,不用查看函数体或文档;其次,有利于将来的代码优化,即使 未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。 参数变量是默认声明的,所以不能用 let 或 const 再次声明。 function foo(x = 5) find, html } = jake; document.querySelectorAll("div.myClass") ::find("p") ::html("hahaha"); 尾调用优化 什么是尾调用? 尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说 清楚,就是指某个函数的最后一步是调用另一个函数。 function f(x){ return return m(x) } return n(x); } 函数的扩展 156 上面代码中,函数 m 和 n 都属于尾调用,因为它们都是函数 f 的最后一步操 作。 尾调用优化 尾调用之所以与其他调用不同,就在于它的特殊的调用位置。 我们知道,函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame), 保存调用位置和内部变量等信息。如果在函数 A0 码力 | 679 页 | 2.66 MB | 1 年前3
廖雪峰JavaScript教程innerText = 'ERROR: ' + status; 27. }); Result: 除了串行执行若干异步任务外,Promise还可以并行执行异步任务。 试想一个页面聊天系统,我们需要从两个不同的URL分别获得用户的个人信息和好友列表,这两个任务 是可以并行执行的,用 Promise.all() 实现如下: 1. var p1 = new Promise(function (resolve }); 由于 p1 执行较快,Promise的 then() 将获得结果 'P1' 。 p2 仍在继续执行,但执行结果 将被丢弃。 如果我们组合使用Promise,就可以把很多异步任务以并行和串行的方式组合起来执行。 原文: https://wizardforcel.gitbooks.io/liaoxuefeng/content/js/40.html 6.6 Promise - 162 ctx.fillText('带阴影的文字', 20, 40); Canvas除了能绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作。如 果要实现非常复杂的操作,考虑以下优化方案: 通过创建一个不可见的Canvas来绘图,然后将最终绘制结果复制到页面的可见Canvas中; 尽量使用整数坐标而不是浮点数; 可以创建多个重叠的Canvas绘制不同的层,而不是在一个Canvas中绘制非常复杂的图;0 码力 | 264 页 | 2.81 MB | 10 月前3
JavaScript Promise迷你书(中文版)Promise是抽象异步处理对象以及对其进行各种操作的组件。 其详细内容在接下来我们 还会进行介绍,Promise并不是从JavaScript中发祥的概念。 Promise最初被提出是在 E语言12中, 它是基于并列/并行处理设计的一种编程语言。 现在JavaScript也拥有了这种特性,这就是本书所介绍的JavaScript Promise。 另外,如果说到基于JavaScript的异步处理,我想大多数都会想到利用回调函数。 128ms。实际我们计算一下 Promise.all 的执行时间的话,它确实是消耗了128ms的时 间。 从上述结果可以看出,传递给 Promise.all 的promise并不是一个个的顺序执行的,而是 同时开始、并行执行的。 如果这些promise全部串行处理的话,那么需要 等待1ms → 等待32ms → 等待64ms → 等待128ms ,全部执行完毕需要225ms的时间。 要想了解更多关于如何使用Promise进行串行处理的内容,可以参考0 码力 | 112 页 | 1010.02 KB | 1 年前3
共 15 条
- 1
- 2













