Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中繁重计算的最佳实践?_Javascript_Design Patterns_Heavy Computation - Fatal编程技术网

Javascript中繁重计算的最佳实践?

Javascript中繁重计算的最佳实践?,javascript,design-patterns,heavy-computation,Javascript,Design Patterns,Heavy Computation,我正在处理客户端脚本,需要进行大量计算,比如在数组中放入大量对象,这会导致JavaScript停止响应,浏览器挂起并发出警报: 是否有处理这些计算的最佳实践或设计模式,我搜索并找到许多不同的方法来处理这些情况,但解决方案很难实现,因此我需要最佳实践和易于理解的方法 (例如,我正在编写代码,但我需要一个跨浏览器的通用解决方案,即多线程等) 示例代码(系列包含数千个对象): for(var series=0;series=chartObj.rangeSelectedInvaliue&&point.

我正在处理客户端脚本,需要进行大量计算,比如在数组中放入大量对象,这会导致JavaScript停止响应,浏览器挂起并发出警报:

是否有处理这些计算的最佳实践或设计模式,我搜索并找到许多不同的方法来处理这些情况,但解决方案很难实现,因此我需要最佳实践和易于理解的方法

(例如,我正在编写代码,但我需要一个跨浏览器的通用解决方案,即多线程等)

示例代码(系列包含数千个对象):

for(var series=0;series如果(point.x>=chartObj.rangeSelectedInvaliue&&point.x好的,看看您的代码,您可以优化以下几点:

var s = chartObj.masterChart.series, // #1
    sLength = s.length,              // #2
    chartMin = chartObj.RangeSelectedMinValue,
    chartMax = chartObj.RangeSelectedMaxValue;
for (var series = 0; series < sLength; series++) {
    var detailData = [],
        data = s[series].data,       // #3
        length = data.length;        // #2
    for(var i = 0; i < length; i++){ // #4
        var point = data[i];
        if (point.x >= chartMin && point.x <= chartMax) {
            detailData.push({
                x: point.x,
                y: point.y
            });
        }

    }
    chartObj.detailChart.series[series].setData(detailData);
}
var s=chartObj.masterChart.series,//#1
长度=s.长度,/#2
chartMin=chartObj.RangeSelectedInvalue,
chartMax=chartObj.RangeSelectedMaxValue;
用于(var系列=0;系列<长度;系列++){
var detailData=[],
数据=s[系列]。数据,//#3
长度=data.length;/#2
对于(var i=0;i如果(point.x>=chartMin&&point.x您可以使用超时将其拆分为不同的“线程”。如下所示:

var counter;

function longRun(start) {
    counter = 0;

    for (var i = start; i < 3000; i++) {

        counter++;
        console.log(i);
        if (counter > 99) {
            setTimeout(function() {
                longRun(i+1)
            }, 0);
                console.log('counter at: ' + i + ' start fake "thread"');
            return;
        }
    }
    alert('Done!');
}
longRun(0);​
var计数器;
功能长运行(启动){
计数器=0;
对于(变量i=开始;i<3000;i++){
计数器++;
控制台日志(i);
如果(计数器>99){
setTimeout(函数(){
朗润(i+1)
}, 0);
log('counter at:'+i+'启动假“线程”);
返回;
}
}
警惕(‘完成’);
}
朗润(0);​

我想它会阻止警告,但我不知道它到底有多理智。

你应该使用

是的 它们是javascript中真正的线程,因为它们生成了真正的OS线程

例子
main.js
heavy_process.js:
for(var series=0;series如果(point.x>=chartObj.rangeSelectedInvalue&&point.x在我看来,Javascript不应该做任何繁重的计算。繁重意味着需要大量数据或真正困难的算法,需要花费大量时间。向我们展示一些代码或向注释说明逻辑这是一个相当开放的主题。发布一些代码使其具体化将是一个更好的步骤。许多事情都是很难实现。解决方案不是找到更简单的东西,而是更努力。@ZaheerAhmed:我们可以说“避免大量循环,避免大量数组/对象,但所有这些都是StackOverflow Q&A格式的通用方法。感谢您进行了很好的优化,实现了!!!:)但是仍然面临问题,这就是为什么我要求一个通用的解决方案?--尼斯+1我认为这4点与我能做到的“通用”差不多。尽管如此,我发现我还可以再做1次编辑。(
chartMin/chartMax
)我完全知道JavaScript中没有线程本身,因此使用引号。但在这种特定情况下,将代码分成块的方法使程序一次可以处理100次迭代。我想我用引号和代码中的log语句清楚地表明,我不是在说真正的线程。它是一个词,我选择它与另一个已知模式进行比较。我很抱歉,如果我混淆了任何一个,JavaScript不仅没有线程,它也没有并行执行的概念。setTimeout或no,两个函数不可能同时运行-它们将始终以串行方式运行。所以这个解决方案不会真正起作用g但请放慢代码的速度。在我的回答中,我没有说过我的解决方案将并行执行函数。重点是退出当前正在运行的函数,然后使用新的开始值重新启动。这里的要点是消除浏览器警告,我的示例就是这样做的。
var counter;

function longRun(start) {
    counter = 0;

    for (var i = start; i < 3000; i++) {

        counter++;
        console.log(i);
        if (counter > 99) {
            setTimeout(function() {
                longRun(i+1)
            }, 0);
                console.log('counter at: ' + i + ' start fake "thread"');
            return;
        }
    }
    alert('Done!');
}
longRun(0);​
var heavy_process = new Worker('heavy_process.js');

heavy_process.addEventListener('message', function(e) {
  // Log the workers message.
  console.log(e.data);
}, false);

heavy_process.postMessage();
for (var series = 0; series < chartObj.masterChart.series.length; series++) {

  var detailData = [];
  jQuery.each(chartObj.masterChart.series[series].data, function (i, point) {
      if (point.x >= chartObj.RangeSelectedMinValue && point.x <= chartObj.RangeSelectedMaxValue) {
        detailData.push({
            x: point.x,
            y: point.y
        });
      }
  });
  chartObj.detailChart.series[series].setData(detailData);
  // you should use self.postMessage here !!!
}