图说c语言
‘壹’ 2.(译)图说前端-ArrayBuffers 和 SharedArrayBuffers
在 上一篇文章 ,我们深入探讨了自动与手动内存管理在JavaScript与C语言中的应用。当我们讨论 ArrayBuffers 和 SharedArrayBuffers 时,为何我们需要了解内存管理?因为ArrayBuffers提供了在具有自动内存管理功能的JavaScript中进行手动内存管理的方式。然而,这背后的原因是什么呢?
自动内存管理虽然简化了开发,但可能带来性能问题,特别是当引擎对变量类型的推测导致内存浪费时。例如,JS引擎为变量预留的内存可能比实际需要的多2至8倍,从而浪费大量内存。同时,某些JS对象的创建模式可能使垃圾回收更加困难。
手动内存管理能提供更灵活的内存分配和更有效的垃圾回收策略,尤其在需要最大化代码性能的场景下。ArrayBuffers和SharedArrayBuffers为开发者提供了这样的选择。
ArrayBuffers在使用上类似JavaScript数组,但不同的是,你只能存放字节(二进制,用数字0与1表示)。ArrayBuffer本身只包含0与1的组合,而不知道字节之间的区分。为了将数据放入,需要通过所谓的视图来实现,比如类型化数组。
例如,你可以使用Int8视图分解为8位字节,或者使用无符号Int16视图分解为16位字节。同一基本缓冲区上可以拥有多种视图,不同的视图在相同操作下会产生不同结果。
ArrayBuffers模拟了直接操作内存访问的语言如C的特性。为何不直接提供内存访问权限?主要是为了安全,直接访问内存可能导致安全漏洞。
接下来,我们介绍SharedArrayBuffers。为了解释SharedArrayBuffers,我们需要了解并行与JavaScript运行代码的概念。并行运行代码可以加速任务处理或提高对用户事件的响应速度,但有时需要拆分任务。在JavaScript中,线程可以加速任务处理,但它们通常不共享内存。
SharedArrayBuffers允许多个线程(包括web worker)从同一内存块中读写数据,从而避免了postMessage的通信开销和延迟。然而,直接访问两个线程的共享内存可能导致竞态条件,需要在后续文章中详细讨论。
SharedArrayBuffers在大多数浏览器中即将得到广泛支持,但建议应用程序开发者使用更高的抽象级别。JavaScript库开发者可以封装SharedArrayBuffers,提供更简单、更安全的使用方式。WebAssembly的实现将进一步利用SharedArrayBuffers,使并发性能得到提高。
在 下一篇文章 ,我们将探索用于建立这些抽象的工具(如原子),同时避免竞态条件。