我有一个JavaScript模块,可以维护和操作大量数据.我有四个大型结构 - 每个基本上都是数组对象的对象.其中有很多数据.当用户执行删除或更新某些操作时,我需要浏览每个结构并可靠地修改结构以反映更改.在某些结构中,根据用户操作,我不知道我需要更改哪个 "叶子"对象,所以我必须遍历所有,等等.
在发生更改时操作这些大型结构的替代方法是将它们清空并从原始数据重建它们.那是我的问题:
从性能的角度来看,在Javascript中,循环和修改现有(大型)数据结构或简单地从原始数据重建结构会更优化吗?
我肯定答案可能是"它取决于",但a)假设大量数据; b)假设频繁更改该数据.
我实际上是在尝试为 Nashorn (java 8) 编写一个事件循环,以便来自异步操作的回调(我启动的线程,例如,连接到远程服务或进行长时间运行的计算)将被放入队列中并执行按顺序(不是并行)。我通过将回调函数放在 ConcurrentLinkedQueue 上并使用 ScheduledExecutorService 作为检查队列以执行回调的循环来做到这一点。
工作正常,但我的问题是:
1) 在不拖拽 CPU 的情况下,我可以使用多短的间隔?我将运行多个这些,并且它们必须彼此独立。因此可能有 50 个线程都在运行它们自己的“事件循环”。例如,此执行程序每 10 毫秒尝试运行一次我的可运行程序....
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(<cbRunnable>, 0, 10, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
2)这种方法是否比:
while (true) {
// check queue and execute any callback...
}
Run Code Online (Sandbox Code Playgroud)
3)有没有更好的方法?
首先,请不要警告我反对eval().我知道了.假设我只是好奇......
接下来,在以下代码中,eval(...)创建一个闭包并捕获参数"arg1".
var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
function test(arg1) {
eval(fnStr);
}
test('hek');
Run Code Online (Sandbox Code Playgroud)
这个输出是"封闭打印arg1:hek".大!正如所料.
但是......如果我将eval分配给变量并执行相同的操作,则闭包不会捕获"arg1".
var fn_ = eval;
var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
function test(arg1) {
fn_(fnStr);
}
test('hek');
Run Code Online (Sandbox Code Playgroud)
此代码段的输出是未定义arg1.如果我测试以确保eval和fn_相等,它们就是......
注意,如果我将this.arg2放在test()的主体中,则eval和fn_都会在闭包中捕获arg2.所以这种怪异似乎只适用于你要关闭的函数的参数.