标签: v8

哪个更快,Clojure或ClojureScript(以及为什么)?

如果我不得不猜测,我很确定答案是Clojure,但我不确定为什么.逻辑上(对我而言)看起来ClojureScript应该更快:

两者都是"动态的",但是ClojureScript

  • 编译为JavaScript,在V8上运行
  • V8引擎可以说是最快的动态语言引擎
  • V8是用C语言编写的

而Clojure:

  • 也是动态的
  • 在JVM中运行,它没有内置的动态支持,因此我认为JVM必须做V8正在做的任何事情,以启用动态支持
  • 而Java比C慢

那么Clojure如何比ClojureScript更快?当说JavaScript是动态的并且Clojure是动态的时,"动态"是否意味着不同的东西?我没看到什么?

(当然,如果ClojureScript 确实快,然后是上面的推理是否正确?)

我想,Clojure编译成什么......至少是问题的一部分.我知道JVM部分不能只是一个普通的解释器(否则ClojureScript会更快),但是Clojure无法编译成常规字节码,因为JVM中没有"动态".那么ClojureScript的编译/执行方式与Clojure的编译/执行方式之间有什么区别?Java是如何编译/执行的,以及各自隐含的性能差异?

v8 clojure clojurescript

17
推荐指数
2
解决办法
6267
查看次数

Nodejs分析:如何处理v8.log文件

我唯一安装的是Nodejs.我使用的是Windows 8 x64.

我通过我的程序运行node --prof app.js.它会生成一个v8.log文件.

现在,我该如何处理v8.log文件?

javascript profiler profiling v8 node.js

17
推荐指数
2
解决办法
1万
查看次数

nodejs v8.getHeapStatistics方法

在nodejs v8模块中,有一个名为getHeapStatistics的函数,它返回一个包含有关内存使用情况的信息的对象:

{ 
  total_heap_size: 221540352,
  total_heap_size_executable: 5242880,
  total_physical_size: 221540352,
  total_available_size: 1286110104,
  used_heap_size: 189179192,
  heap_size_limit: 1501560832,
  malloced_memory: 16384,
  peak_malloced_memory: 1325112,
  does_zap_garbage: 0 
}
Run Code Online (Sandbox Code Playgroud)

每个领域的含义是什么?

memory v8 node.js

17
推荐指数
1
解决办法
1577
查看次数

JavaScript 数组性能在 13k-16k 元素时下降

我正在对数组的创建和编辑性能进行一些性能测试,并注意到大约有 13k-16k 元素的数组周围有一些奇怪的特征。

下图显示了创建数组并从中读取每个元素所需的时间(在本例中是对数组中的数字求和)。capacitypush与数组的创建方式相关:

  • 容量const arr = new Array(length)然后arr[i] = data
  • const arr = [];然后arr.push(data)

根据长度创建数组的时间 基于长度的数组操作时间

正如您所看到的,在这两种情况下,创建数组并读取数组时,与元素少 1k 时每个元素的性能相比,性能降低了约 2-3 倍。
当使用push方法创建数组时,与事先使用正确的容量创建数组相比,这种跳转发生得更早一些。我认为发生这种情况是因为,当推送到已经达到最大容量的阵列时,添加的额外容量超过了实际需要的额外容量(以避免很快再次添加新容量),并且达到了较慢性能路径的阈值早些时候。

如果您想查看代码或自己测试:github

我的问题是,为什么性能会下降到 13k-16k 左右?

对我来说,在 v8 中,从大约 13k-16k 元素开始,较大的数组会受到不同的处理,以提高它们的性能,但截止点(至少在我的代码中)有点太早,因此在优化带来之前性能下降任何好处。

您可以看到性能改进在大约 500 个元素后下降,并在下降后再次上升。

遗憾的是我找不到任何相关信息。

另外,如果您碰巧知道为什么在容量创建和推送求和结束时会出现这些峰值,请随时告诉我:)

编辑:

正如 @ggorlen 所建议的,我在另一台机器上运行相同的测试,以排除缓存作为所见行为的原因(使用不同的、较弱的 CPU 和较少的 RAM)。结果看起来非常相似。

在不同机器上根据长度创建数组的时间 在不同机器上基于长度的数组操作时间

编辑:

我使用该--allow-natives-syntax标志运行节点来调试日志创建的数组%DebugPrint(array);,希望看到不同数组长度之间的差异,但除了长度和内存地址之外,它们看起来都相同。这是一个例子:

// For array created with capacity
DebugPrint: 000002CB8E1ACE19: [JSArray]
 - map: 0x035206283321 <Map(HOLEY_SMI_ELEMENTS)> [FastProperties]
 - prototype: 0x036b86245b19 <JSArray[0]>
 - …
Run Code Online (Sandbox Code Playgroud)

javascript arrays v8

17
推荐指数
1
解决办法
907
查看次数

ECMAScript-262的IDE,用于node.js/V8的IDE执行/调试

我目前使用Eclipse作为其他语言的IDE,而我习惯于不必离开IDE用于任何事情 - 但是我真的很难找到纯ECMAScript-262的相同或类似的设置.

为了澄清,我不是在寻找DOM支持,jquery,HTML或类似的东西,最好只是一个内置ECMAScript-262支持(pref node.js)的IDE(调试并不重要),这样我就可以简单地运行我的代码了IDE.

有任何想法吗?

ps:请不要建议aptana.

javascript ide v8 ecma262 node.js

16
推荐指数
1
解决办法
3376
查看次数

在Nodejs中,当我在console.log中有一个req对象时,[Circular]引用了什么?如何确定

在Nodejs中,当我在console.log中有一个req对象时,[Circular]是什么意思?

这是针对基本nodejs示例的示例console.log(req).请注意,request.socket._readWatcher.socket是[Circular].这是否意味着它指的是自己?我该如何取消引用?

{ socket: 
   { bufferSize: 0,
     fd: 7,
     type: 'tcp4',
     allowHalfOpen: true,
     _readWatcher: 
      { socket: [Circular],
        callback: [Function: onReadable] },
     destroyed: false,
     readable: true,
     _writeQueue: [],
     _writeQueueEncoding: [],
     _writeQueueFD: [],
     _writeQueueCallbacks: [],
     _writeWatcher: 
      { socket: [Circular],
        callback: [Function: onWritable] },
     writable: true,
     _writeImpl: [Function],
     _readImpl: [Function],
     _shutdownImpl: [Function],
     remoteAddress: '127.0.1.1',
     remotePort: 40407,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        watcher: [Object],
        _events: [Object],
        httpAllowHalfOpen: false,
        type: 'tcp4',
        fd: 5 },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { repeat: 120,
        _idleNext: [Circular], …
Run Code Online (Sandbox Code Playgroud)

v8 circular-reference node.js

16
推荐指数
2
解决办法
1万
查看次数

任何节点的反模式?

node.js 的反模式是什么,使用node.js开发时应该避免什么?

GC,闭包,错误处理,面向对象等危险.

v8 node.js

16
推荐指数
1
解决办法
3327
查看次数

V8是否自动缓存编译的正则表达式?

所以我知道在Javascript实例化一个正则表达式会导致它被自动编译,如果该正则表达式存储在一个变量中,它将被重用而无需重新编译.例:

var re = /[Ff]oo|[Bb]ar/;
"Foo".match(re); // ["Foo"]
"Baz".match(re); // null
Run Code Online (Sandbox Code Playgroud)

但是,重新编译重复的正则表达式还是V8(Chrome/Node.js)智能地重用它们(就像PHP与preg_*函数一样)?

function isFooBar(str) {
  return str.match(/[Ff]oo|[Bb]ar/);
}
isFooBar("Foo"); // ["Foo"]
isFooBar("Baz"); // null
Run Code Online (Sandbox Code Playgroud)

所以为了澄清,我知道第一个例子是一个正则表达式编译的结果.但是第二个例子怎么样?

javascript regex v8 node.js

16
推荐指数
1
解决办法
2498
查看次数

使用V8 JavaScript引擎在没有Web视图的情况下执行JS lib

我正在开发一个JavaScript组件,负责向服务器发出请求并将结果分派给UI.通过在JavaScript中执行此操作,我可以在多种类型的UI中使用我的组件:Android应用程序,iOS应用程序,桌面应用程序(QT),Web应用程序......

所有这些UI都实例化了一个Web视图,因此当UI加载专用URL(webview.load("file://myfirstWebPage.html"))时,我的组件就会启动.

第一个网页加载所有JavaScript组件,一旦完成,UI就能够向JavaScript组件发出一些请求,这会向服务器发出请求,当它有响应时,它会将其发送回客户端( UI Android,UI iOS ...)

这个架构工作正常,但我想知道是否有另一种方法加载JavaScript组件而不使用每个客户端上的Web视图?

V8引擎可以帮助我吗?

javascript v8 webview

16
推荐指数
3
解决办法
2万
查看次数

可选链 - Function.prototype.apply 在 undefined 上被调用,这是一个 undefined 而不是函数

对函数调用使用可选链接会导致表达式自动返回 undefined 而不是在找不到方法时抛出异常。

注意:代码使用的是spread syntax,而不是rest parameters

const fn1 = undefined
const args = []
const fn2 = () => {}
const fn3 = () => {}

console.log(fn1?.(...args, fn2, fn3))
Run Code Online (Sandbox Code Playgroud)

错误:

console.log(fn1?.(...args, fn2, fn3))
                                ^
TypeError: Function.prototype.apply was called on undefined, which is an undefined and not a function
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome v8 node.js optional-chaining

16
推荐指数
1
解决办法
652
查看次数