Questions tagged «v8»

V8是Google的开源JavaScript引擎。

4
node.js支持什么版本的Javascript
我开始使用Node.js,并且很难确定节点支持哪种JavaScript版本,这使得很难确定可以使用哪些功能。这就是我所知道的。 节点使用V8 V8实现了ECMA-262,第3版中指定的ECMAScript ECMA-262,第三版是JavaScript 1.5 鉴于此,我假设我可以在节点中使用JavaScript 1.5兼容代码。但是,事实证明,我可以使用Array.forEach,以及其他结构,即使根据MDC,它直到Javascript 1.6-ECMA-262,第5版才可用。 我要去哪里错了?是否有文件详细说明可用的语言功能?
81 javascript  node.js  v8 

2
为什么绑定比关闭慢?
先前的发帖人在Javascript中问Function.bind vs Closure:如何选择? 并部分地收到了这个答案,这似乎表明bind应该比闭包更快: 范围遍历意味着,当您要获取存在于另一个范围中的值(变量,对象)时,因此会增加额外的开销(代码执行起来会变慢)。 使用bind时,您正在使用现有范围调用函数,因此不会发生范围遍历。 两个jsperfs表示bind实际上比闭包要慢得多。 这是对以上内容的评论 而且,我决定编写自己的jsperf 那么,为什么结合速度这么慢(铬含量超过70%)? 由于速度不是更快,并且闭包可以达到相同的目的,是否应避免绑定?


3
长期支持(LTS)和稳定版本的Node.js有什么区别?
最初询问:具有LTS(长期支持)的Node.js 4.x分支与5.x分支(列为稳定版)之间有什么区别? 但这对于理解6.x和7.x之间的区别以及将来的8.x和9.x之间的区别同样重要。 通常,我总是倾向于最新版本的功能和性能(因为我现在做很多ES6 / ES7)。是否有关于“稳定”分支准备就绪的信息?

11
Mac OS X Lion上的'gem install therubyracer'失败
希望能对您的gem install therubyracer工作有所帮助。这是错误: $ gem install therubyracer Building native extensions. This could take a while... ERROR: Error installing therubyracer: ERROR: Failed to build gem native extension. /Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby extconf.rb checking for main() in -lobjc... yes *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary …
70 ruby  rubygems  v8 

1
如何从C ++插件中的'MediaStream'对象读取音频数据
经过流血和眼泪,我终于设法建立了一个Node C ++附加组件,并将一个Web平台标准MediaStream对象永久地推入其C ++方法之一。为了在不同的V8和Node.js版本之间实现兼容性,我将原生抽象用于Node.js(nan): 插件 NAN_METHOD(SetStream) { Nan::HandleScope scope; v8::Local<v8::Object> mediaStream = info[0]->ToObject(); } addon.js setStream(new MediaStream()); 对于它的价值,它可以正常工作(即,它不会消除渲染器进程的视线),并且我可以验证MediaStream对象的存在,例如,通过从C ++方法返回其构造函数名称: 插件 info.GetReturnValue().Set(mediaStream->GetConstructorName()); 当从JavaScript通过调用时setStream,这将返回字符串MediaStream,因此该对象肯定在那里。我还可以返回mediaStream对象本身,并且一切都会正常运行,因此确实是我需要的对象。 那么,我将如何MediaStream在C ++中从此对象读取音频数据(即音频样本)?附带说明一下,实际的数据读取(和处理)将在单独的中完成std::thread。 赏金更新 我知道,如果我自己编译Electron和/或Chromium,这样做会更容易/可行,但我不想参与该维护工作。 我想知道是否可以不这样做,就我的研究而言,我深信我需要两件事来完成此任务: 相关的头文件,我相信会公开应该足够了 铬/闪烁库文件(?),用于解析外部符号,类似于node.dylib文件 而且,正如我所说,我相信自己可以自己编译Chrome / blink,然后获得这个lib文件,但这将为Electron带来麻烦。考虑到这一点,我相信这个问题最终可以归结为C ++链接问题。还有其他方法可以做我想要的吗? 编辑 在我的案例中,ScriptProcessorNode不是一个选择,因为它的性能使其在生产中几乎无法使用。这将需要在ui / main线程上处理音频样本,这绝对是疯狂的。 编辑2 AudioWorklets在Electron中已经存在了一段时间,与ScriptProcessorNode(或更糟糕的是,AnalyzerNode)不同,具有低延迟并且对于实时C ++支持的音频处理来说非常可靠。 在我的应用程序(AudioNodes)中,我已经为实验性的VST插件主机原型(很可能是第一个Web Audio API)实现了这种方法。 如果有人想继续写一个基于AudioWorklet的答案,我会很乐意接受,但要提防:这是一个非常先进的领域,而且洞洞很深,即使在非常简单,通用的应用程序之前也要克服无数障碍传递原型(特别是因为当前在Electron中需要原子同步的缓冲跨线程音频处理才能实现此目的,因为https://github.com/electron/electron/issues/22503-尽管获取本机将C ++插件添加到一个音频渲染器线程(更不用说同时使用多个线程)可能同样具有挑战性。
70 javascript  c++  electron  v8  blink 

3
查找未处理的承诺拒绝的来源:TypeError:检测到承诺的链接周期
我正在尝试从Node.js中的Promise中找到未处理的拒绝的来源 我尝试使用--async-stack-traces选项升级到节点版本12,并使用以下命令监听它们: process.on("unhandledRejection",( reason, promise ) => { console.log(reason); console.log(promise); }); 但是我仍然看不到任何有用的堆栈跟踪信息来帮助我找到罪魁祸首! UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise> at process._tickCallback (internal/process/next_tick.js:68:7) (node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was …

3
我可以关闭优化吗​​,所以闭包中的范围内变量不会被“优化”
作为现代浏览器完成代码优化的副产品,在调试时,您无法“看到”“实际上”在范围内的所有变量。这是众所周知的,并且已经在SO上的上一个问题中得到了解决。此功能虽然在生产中最肯定有用,但在开发过程中却使我很烦,但它会使我放慢速度(这很明显)。 现在我的问题是,有什么办法可以关闭这种行为?我可以编辑一些配置文件,还是有浏览器插件,或者有浏览器可执行文件的“开发人员专用构建版本”?我喜欢在编写新代码时立即在控制台中输入代码,所以这确实困扰了我。 更新/编辑 这是部分解决方案,应归功于Paul1365972。 您必须使用特殊选项从命令行启动chrome浏览器,如下所示: 完全关闭Chrome 从控制台运行Chrome "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" ,适用于Windows其他操作系统。 打开开发人员控制台并执行"%GetHeapUsage()"。如果您使用选项正确启动了Chrome,则会在控制台上记录一个数字,否则会出现语法错误。 使用此命令行标志,您可以使用以开头的命令与V8引擎“对话” %,这是普通JavaScript中的语法错误。Paul的答案中列出了可用的此类V8命令。 有%NeverOptimizeFunction()该列表,这是一些东西,看起来像的东西我只需要调用,并用它做的。不幸的是,该功能没有实现我所希望的,如下面的屏幕快照所示。 (((在保罗的回答其他链接(V8本地人节点模块)并不那么重要,对我们这里在这种情况下,它所做的就是它环绕的“%”功能调用单行这样的代码不会崩溃不是v8的浏览器。))) ((((((我记得有一次它是在那时(尚未发明/实现这种优化)。我不知道多久。十年?十五年?类似的东西。最后一个Chrome版本是什么(如果任何)以及您可以做什么的最后一个Firefox版本(请确保在此存在)是什么?如果您碰巧知道并将其发布为答案,它不会给您带来悬赏,但会给您带来赞誉。 。))) 解决方案 谢谢彼得·斯尼科克 新问题 虽然Petr的解决方案有很大帮助,但这并不完美。这个问题太长了,所以我发布了一个新的问题,关于如何改进Petr的解决方案。(我当然可以在这里编辑此问题,但是,如果您了解我的意思,那将感到“不历史”。)

1
编写高性能的Javascript代码而无需优化
当使用对大型数值数组(例如线性代数程序包,对整数或浮点数进行操作)的Javascript编写对性能敏感的代码时,总是希望JIT尽可能提供帮助。大概意味着: 我们始终希望数组是压缩的SMI(小整数)或压缩的Double,这取决于我们是在进行整数还是浮点计算。 我们始终希望将相同类型的事物传递给函数,以使它们不会被标记为“大形”或未优化。例如,我们始终希望同时调用vec.add(x, y)这两个x并y打包SMI数组,或者同时打包两个Double数组。 我们希望尽可能内联函数。 当一个人偏离这些情况时,会突然而突然地降低性能。出于各种无害的原因,可能会发生这种情况: 您可以通过看似无害的操作将压缩的SMI数组转换为压缩的Double数组,例如的等效项myArray.map(x => -x)。实际上,这是“最佳”的坏情况,因为压缩Double数组仍然非常快。 您可以将打包的数组变成通用的盒装数组,例如通过将数组映射到(意外地)返回null或的函数上undefined。这种情况很容易避免。 您可能会取消对整个函数的优化,例如vec.add()通过传递太多类型的事物并将其变为大形。如果您想进行“泛型编程”,vec.add()则可能会发生这种情况,这种情况在您对类型不十分小心的情况下使用(这样会看到很多类型),并且在想要最大程度地提高性能的情况下也可以使用(例如,它只能收到盒装双打)。 我的问题更多是一个软问题,关于如何根据上述考虑编写高性能的Javascript代码,同时又保持代码的美观和可读性。一些特定的子问题,以便您了解我的目标是: 在打包SMI阵列的世界中,例如,在编程方面有一些准则吗? 是否可以使用Javascript进行通用的高性能编程,而无需使用诸如宏系统之类的工具将其内联vec.add()到callsite中? 鉴于宏调用站点和优化问题,如何将高性能代码模块化到库中?例如,如果我愉快地A高速使用Linear Algebra程序包,然后导入B依赖的程序包A,但B使用其他类型调用该程序包,然后对其进行优化,那么突然(无需更改代码)我的代码运行速度就会变慢。 是否有任何易于使用的良好测量工具来检查Javascript引擎在内部对类型进行的操作?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.