【问题标题】:Is there some way to "nice" my JavaScript execution?有什么方法可以“很好地”执行我的 JavaScript 吗?
【发布时间】:2011-02-11 19:45:18
【问题描述】:

我想在浏览器窗口中运行一些计算,但我不希望它减慢客户端计算机进行用户交互的速度,尤其是对于单核计算机。有什么方法可以调整我执行 JavaScript 的良好级别,使其在不影响机器响应能力的情况下尽可能快地执行?

【问题讨论】:

  • 有趣的问题!我不认为有 - 至少不在 JS 沙箱内 - 但我们会看到。然而,任何阻塞客户端资源this的计算都属于服务器,这是理所当然的。
  • 多核机器如何帮助执行 JavaScript?它甚至不支持多线程。
  • @Pierreten 完全依赖于解释 JavaScript 的浏览器或应用程序。
  • @Austin:当然是正确的,但目前市场上的任何浏览器都没有实现它(我不知道网络工作者是否是真正的多线程)
  • @Pekka:这是一个轻率的分布式计算思想,所以重点是在客户端上运行。否则,当然,你是绝对正确的。 @Pierreten:我想避免让客户端计算机无响应,我希望这在单核机器上比在多核机器上更糟糕。

标签: javascript nice renice


【解决方案1】:

除了延迟执行您的计算之外,我想不出别的办法。例如,将所有工作分成小块,然后按顺序运行它们,每个任务之间有一些延迟(使用setTimeoutsetInterval)。

【讨论】:

    【解决方案2】:

    创建开环...一个例子

    这是一个闭环

    for( i = 0 ; i < 10000 ; i++)
    {
        doSomeMath(i);
    }
    

    这是一个开环

    i = 0;
    iMax = 10000
    var MyWorkingThread =
    setInterval(function()
    {
        if( i < iMax)
        {
           doSomeMath(i);           
           i++;
        }
        else
        {
            clearInterval(MyWorkingThread);
        }
    
    },1);
    

    您可以在开环内做更多或更少的工作,但这是一般的想法。我为类似的问题做了很多次,我让浏览器工作得非常顺利。

    【讨论】:

      【解决方案3】:

      为了加快速度,尝试使用单个多维数组来包含您的数据,然后在函数结束时使用单个连接将该数组转换为字符串以进行输出,并使用 innerHTML 方法输出该数据。这是在 JavaScript 中包含和提供数据的最快方法。绝对不要使用 DOM 方法或元素来输出数据,因为这样会慢 4 倍。

      尽可能少地输出数据。这将取决于您使用哪个事件来执行您的功能。我建议不要使用 onload 事件,因为这会减慢页面的初始加载时间。我建议使用与按钮关联的 onclick 函数,因为这样用户就会意识到他们导致执行会减慢您的页面速度。

      【讨论】:

        【解决方案4】:

        我做了一些测试,浏览器需要相当长的一段时间才能正常响应:

        function work(cnt) {
          // do some heavy work
          for (var i=0;i<100000000;i++) ;
          // start next work
          if (cnt > 0) {
            window.setTimeout(function(){work(cnt-1);},200);
          }
        }
        

        【讨论】:

          【解决方案5】:
          1. 使用 ajax 请求在服务器上运行计算
          2. 打开一个新窗口或框架并在那里运行代码
          3. 在分成多个区间的循环中运行代码
          4. 准备好使用网络工作者进程(html5 异步脚本)

          【讨论】:

          • ??如果他使用的是网络工作者,他为什么要将处理工作卸载到服务器上?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 2012-03-08
          • 1970-01-01
          • 1970-01-01
          • 2019-06-09
          相关资源
          最近更新 更多