我目前正在尝试使用IFRAME来实现一个非常简单的多线程引擎。但是我的初步结果表明,在线程中运行比在单个线程中运行要慢。
我的测试是:
单线程
var start = new Date().getTime();
for (var i = 0; i < 300; i++) { /* Do costly processor operations */ }
debug('Took: ' + new Date().getTime() - start);
多线程
var start = new Date().getTime();
// In thread 1
for (var i = 0; i < 100; i++) { /* Do costly processor operations */ }
// In thread 2
for (var i = 100; i < 200; i++) { /* Do costly processor operations */ }
// In thread 3
for (var i = 200; i < 300; i++) { /* Do costly processor operations */ }
// In a callback in the original FRAME (thread)
debug('Took: ' + new Date().getTime() - start);
可以看出,我只是在IFRAME之间分配工作量(上面的注释代码只是为了更好地描述我正在做的事情,它不是工作代码)。
所以我认为即使使用FRAME FireFox仍然只有一个JS引擎?这个假设是否正确? (使我的研究变得愚蠢),其他浏览器是否有所不同?
快速谷歌我得到了这篇文章:http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html
然而,这里实现的性能改进很可能只是执行并行的http请求而不是处理能力。
感谢您的见解。
圭
答案 0 :(得分:3)
查看HTML5 Web Workers标准,了解JavaScript线程的外观。这是在Firefox 3.5,Safari 4和Chrome 3中实现的,但不是IE。如果您愿意为IE用户和旧浏览器要求插件,请查看Google Gears WorkerPool。
答案 1 :(得分:0)
不,Javascript通常不支持多线程。大多数解释器都没有内置的任何多线程功能(就像PHP一样),可能是出于可移植性的原因。
但是,由于Rhino引擎完全用Java编写,因此may be able to tap into the Thread class,但这只有在您使用服务器端Javascript时才可行。
答案 2 :(得分:0)
答案 3 :(得分:0)
setTimeout 调用可能是一个很好的解决方案。
这取决于你所谓的线程。不,这不会将任何负载传播到其他核心,但它是多线程的,因为进程的线程被放弃到代码中的另一个进程。将繁重的周期分成块,你可以让渲染引擎和其他事件进入。
答案 4 :(得分:-1)
您可以尝试在setTimeout调用中包装您的操作。