在Chrome控制台中执行此代码段:
function foo() {
return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());Run Code Online (Sandbox Code Playgroud)
应打印1000次false,但在某些机器上将打印false多次迭代,然后true用于其余部分.
为什么会这样?这只是一个错误吗?
与JavaScript中的数组和对象(尤其是Google V8)相关的性能对于文档来说非常有趣.我在互联网上找不到关于这个主题的综合文章.
我知道一些对象使用类作为它的底层数据结构.如果有很多属性,它有时被视为哈希表?
我也理解,数组有时被视为C++数组(即快速随机索引,慢速删除和调整大小).而且,其他时候,它们更像对象(快速索引,快速插入/删除,更多内存).并且,有时它们可能存储为链接列表(即慢速随机索引,在开头/结尾快速删除/插入)
JavaScript中的数组/对象检索和操作的精确性能是什么?(专门针对Google V8)
更具体地说,它对性能的影响如下:
任何文章或链接的更多细节也将不胜感激.:)
编辑:我真的很想知道JavaScript数组和对象是如何工作的.此外,在什么情况下 V8引擎"知道""转换"到另一个数据结构?
例如,假设我用...创建一个数组
var arr = [];
arr[10000000] = 20;
arr.push(21);
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?
或者......这个怎么样...... ???
var arr = [];
//Add lots of items
for(var i = 0; i < 1000000; i++)
arr[i] = Math.random();
//Now I use it like a queue...
for(var i = 0; i < arr.length; i++)
{
var item = arr[i].shift();
//Do something with item...
} …Run Code Online (Sandbox Code Playgroud) 如何在Node.js中获得最准确的时间戳?
ps我的Node.js版本是0.8.X,node-microtime扩展名对我不起作用(安装时崩溃)
之前的一张海报在Javascript中询问了Function.bind vs Closure:如何选择?
并且部分收到了这个答案,这似乎表明bind应该比闭包更快:
范围遍历意味着,当您要获取存在于不同范围内的值(变量,对象)时,会增加额外开销(代码执行速度变慢).
使用bind,您将调用具有现有范围的函数,因此不会进行范围遍历.
两个jsperfs表明bind实际上比闭包慢得多.
这是作为对上述评论发布的
并且,我决定编写自己的jsperf
那么为什么绑定这么慢(铬+ 70%)?
由于它不是更快并且闭包可以起到相同的作用,应该避免绑定吗?
我开始使用Node.js并且我很难弄清楚节点支持哪种版本的JavaScript,这使我很难弄清楚我可以使用哪些功能.这就是我所知道的.
鉴于此,我认为我可以在节点中使用JavaScript 1.5兼容代码.然而,事实证明我可以使用Array.forEach其他构造,尽管根据MDC它直到Javascript 1.6 - ECMA-262,第5版才可用.
我哪里错了?是否有某个文档详细说明了可用的语言功能?
我process.binding('...')通过github上的node.js源代码研究了很多次.
任何人都能解释一下这个函数的作用吗?
我很感激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 libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
--with-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/david/.rvm/rubies/ruby-1.9.3-p194/bin/ruby …Run Code Online (Sandbox Code Playgroud) 在流血和流泪之后,我终于设法建立了一个Node C++插件,并将一个Web平台标准MediaStream对象推送到其C++方法之一.为了兼容不同的V8和Node.js版本,我使用Native Abstractions for Node.js(nan):
addon.cc
NAN_METHOD(SetStream)
{
Nan::HandleScope scope;
v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
Run Code Online (Sandbox Code Playgroud)
addon.js
setStream(new MediaStream());
Run Code Online (Sandbox Code Playgroud)
对于它的价值,它可以正常工作(即它不会立即删除渲染器进程),并且我可以验证MediaStream对象的存在,例如通过从C++方法返回其构造函数名称:
addon.cc
info.GetReturnValue().Set(mediaStream->GetConstructorName());
Run Code Online (Sandbox Code Playgroud)
当从JavaScript调用时setStream,这将返回字符串MediaStream,因此对象肯定存在.我也可以返回mediaStream对象本身,一切都会正常工作,所以它确实是我需要的对象.
那么,我如何MediaStream在C++中从这个对象中读取音频数据(即音频样本)?作为旁注,实际数据读取(和处理)将在单独的情况下完成std::thread.
我明白如果我自己编译Electron和/或Chromium,这将更容易/可能,但我宁愿不参与维护地狱.
我想知道如果没有这样做是否可能,并且就我的研究而言,我确信我需要做两件事:
另外,正如我所说,我相信我可以自己编译chrome/blink然后我会有这个lib文件,但这对于Electron来说是一个维护地狱.考虑到这一点,我相信这个问题最终归结为C++链接问题.有什么其他方法可以做我正在寻找的东西吗?
在我的情况下,ScriptProcessorNode不是一个选项,因为它的性能使它在生产中几乎无法使用.这将需要在ui /主线程上处理音频样本,这绝对是疯狂的.
无论功能差异如何,使用新关键字"let"和"const"对"var"的性能有任何广义或特定的影响吗?
运行程序后:
function timeit(f, N, S) {
var start, timeTaken;
var stats = {min: 1e50, max: 0, N: 0, sum: 0, sqsum: 0};
var i;
for (i = 0; i < S; ++i) {
start = Date.now();
f(N);
timeTaken = Date.now() - start;
stats.min = Math.min(timeTaken, stats.min);
stats.max = Math.max(timeTaken, stats.max);
stats.sum += timeTaken;
stats.sqsum += timeTaken * timeTaken;
stats.N++
}
var mean = stats.sum / stats.N;
var sqmean = stats.sqsum / stats.N;
return {min: stats.min, max: stats.max, mean: mean, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试进行实验,看看函数中的局部变量是否存储在堆栈中.
所以我写了一点性能测试
function test(fn, times){
var i = times;
var t = Date.now()
while(i--){
fn()
}
return Date.now() - t;
}
ene
function straight(){
var a = 1
var b = 2
var c = 3
var d = 4
var e = 5
a = a * 5
b = Math.pow(b, 10)
c = Math.pow(c, 11)
d = Math.pow(d, 12)
e = Math.pow(e, 25)
}
function inversed(){
var a = 1
var b = 2
var c = 3 …Run Code Online (Sandbox Code Playgroud)