如果我不得不猜测,我很确定答案是Clojure,但我不确定为什么.逻辑上(对我而言)看起来ClojureScript应该更快:
两者都是"动态的",但是ClojureScript
而Clojure:
那么Clojure如何比ClojureScript更快?当说JavaScript是动态的并且Clojure是动态的时,"动态"是否意味着不同的东西?我没看到什么?
(当然,如果ClojureScript 是确实快,然后是上面的推理是否正确?)
我想,Clojure编译成什么......至少是问题的一部分.我知道JVM部分不能只是一个普通的解释器(否则ClojureScript会更快),但是Clojure无法编译成常规字节码,因为JVM中没有"动态".那么ClojureScript的编译/执行方式与Clojure的编译/执行方式之间有什么区别?Java是如何编译/执行的,以及各自隐含的性能差异?
我唯一安装的是Nodejs.我使用的是Windows 8 x64.
我通过我的程序运行node --prof app.js.它会生成一个v8.log文件.
现在,我该如何处理v8.log文件?
在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)
每个领域的含义是什么?
我正在对数组的创建和编辑性能进行一些性能测试,并注意到大约有 13k-16k 元素的数组周围有一些奇怪的特征。
下图显示了创建数组并从中读取每个元素所需的时间(在本例中是对数组中的数字求和)。capacity并push与数组的创建方式相关:
const arr = new Array(length)然后arr[i] = dataconst arr = [];然后arr.push(data)正如您所看到的,在这两种情况下,创建数组并读取数组时,与元素少 1k 时每个元素的性能相比,性能降低了约 2-3 倍。
当使用push方法创建数组时,与事先使用正确的容量创建数组相比,这种跳转发生得更早一些。我认为发生这种情况是因为,当推送到已经达到最大容量的阵列时,添加的额外容量超过了实际需要的额外容量(以避免很快再次添加新容量),并且达到了较慢性能路径的阈值早些时候。
如果您想查看代码或自己测试:github
对我来说,在 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)我目前使用Eclipse作为其他语言的IDE,而我习惯于不必离开IDE用于任何事情 - 但是我真的很难找到纯ECMAScript-262的相同或类似的设置.
为了澄清,我不是在寻找DOM支持,jquery,HTML或类似的东西,最好只是一个内置ECMAScript-262支持(pref node.js)的IDE(调试并不重要),这样我就可以简单地运行我的代码了IDE.
有任何想法吗?
ps:请不要建议aptana.
在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) 所以我知道在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组件,负责向服务器发出请求并将结果分派给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引擎可以帮助我吗?
注意:代码使用的是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)