V8的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?
我写了一个非常简单的基准:
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var')
console.time('let');
for (let i = 0; i < 100000000; i++) {}
console.timeEnd('let')
Run Code Online (Sandbox Code Playgroud)
如果你正在运行Chrome,可以在这里试试(因为NodeJS和Chrome使用相同的JavaScript引擎,虽然版本通常略有不同):
// Since Node runs code in a function wrapper with a different
// `this` than global code, do that:
(function() {
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var')
console.time('let');
for (let i = 0; i < 100000000; i++) {}
console.timeEnd('let')
}).call({});Run Code Online (Sandbox Code Playgroud)
结果令我惊讶:
var: 89.162ms
let: 320.473ms
Run Code Online (Sandbox Code Playgroud)
我在Node 4.0.0 && …
V8是node.js的重要组成部分,它使用Google V8 Javascript引擎.在我的Windows框[Windows 7/64位]上构建V8将花费我数小时的时间来抓取并安装我不熟悉的工具(尽管我使用的是Cygwin).如果那里有一些二进制安装程序,它会给我带来很多麻烦.谷歌搜索没有返回任何明显的位置 - 这里的大师知道吗?
即使你不知道我的确切环境,在这里分享其他人也会帮助同一条船上的人...
我正在使用express在Node.js中做一个项目.这是我的目录结构:
root
|-start.js
|-server.js
|-lib/
| api/
| user_getDetails.js
| user_register.js
Run Code Online (Sandbox Code Playgroud)
该lib/api/目录有许多与API相关的JS文件.我需要做的是制作一种挂钩系统,无论何时从快速HTTP服务器请求其中一个API函数,它都会执行相应API处理程序中指定的任何操作.这可能令人困惑,但希望你能得到这个想法.
lib/api与该请求关联的功能.希望你能帮助我.我当时认为可以使用原型来完成,但不确定.
谢谢!
有谁知道我怎么能看到v8从Javascript生成的实际机器代码?我已经到了这里Script::Compile(),src/api.cc但我无法弄清楚从哪里去.
我需要知道用户点击触发的按钮,window.open如果有稳定的API /预先知道用户是否主动拥有弹出窗口阻止程序?
在某些情况下,用户不知道/注意他们有弹出窗口阻止程序(阻止新窗口).我想通过点击允许来通过一些对话框/或者某些东西来通知他们.
使用Google的V8引擎,是否真的可以将JavaScript编译为本机代码,将其保存为二进制文件,并在任何计算机上通过我的软件环境执行它?
所以我有这个简单的代码:
function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
}
var start = Date.now();
Run();
console.log(Date.now() - start);
Run Code Online (Sandbox Code Playgroud)
它会输出大约335毫秒的时间.那很不错.但是,如果我像这样封装Run函数:
var d = Date.now();
(function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}
return inside;
})();
console.log(Date.now() - d);
Run Code Online (Sandbox Code Playgroud)
它将输出18319ms,这比以前的情况要糟糕得多.为什么是这样 ?
此外,如果重要,我在控制台的Chrome 26.0.1410.63上运行它.在node.js上,两个片段在控制台上都表现良好.
javascript compiler-construction optimization performance v8
我试图在一个相对复杂的Node.js服务器应用程序中分析内存/ GC问题.即使在非常适中的负载下,它也会在明显的时期内变得无法响应,并且随着时间的推移这些停顿会变得更长.使用--trace-gc参数运行表明可能导致极长的垃圾回收时间:
[4805] 537 ms: Mark-sweep 17.6 (46.4) -> 10.3 (47.4) MB, 20 ms [allocation failure] [GC in old space requested].
[4805] 1338 ms: Mark-sweep 31.3 (58.4) -> 19.2 (57.2) MB, 40 ms [allocation failure] [promotion limit reached].
[4805] 2662 ms: Mark-sweep 58.0 (79.2) -> 43.9 (85.2) MB, 109 ms [Runtime::PerformGC] [promotion limit reached].
[4805] 4014 ms: Mark-sweep 90.1 (111.5) -> 70.6 (113.9) MB, 114 ms [allocation failure] [promotion limit reached].
[4805] 7283 ms: Mark-sweep 129.7 (153.9) -> …Run Code Online (Sandbox Code Playgroud) [ 我编辑了我的问题,将场景缩小到只有Node.js. 请重新打开它.这是一个有用的问题,正如ChakraCore还处于很小的年龄时,可能会在未来及时提出正确的答案.但这个问题是有效的,应该在这里 ]
我们都知道/阅读/听说过谷歌V8引擎的荣耀,以及它如何让node.js成为多年来的美丽.
但现在我们可以选择在Microsoft的ChakraCore和Google的V8之间作为我们首选的JavaScript引擎进行选择,我想知道是否有人有任何证据或测试用例,他们发现其中一个比nodejs更有效.
请回复一些事实和结果,因为有人不应该使用/选择Chakra只是因为他/她喜欢微软或同样适用于V8和Google.
谢谢.
v8 ×10
javascript ×9
node.js ×5
c++ ×3
api ×1
chakra ×1
ecmascript-6 ×1
memory-leaks ×1
native-code ×1
optimization ×1
performance ×1
prototype ×1
window ×1