JavaScript setInterval 后 CPU 使用率高

Posted

技术标签:

【中文标题】JavaScript setInterval 后 CPU 使用率高【英文标题】:high CPU usage after JavaScript setInterval 【发布时间】:2013-09-12 20:43:31 【问题描述】:

我有一个 php 代码,它从数据库中提取文本,并将其作为链接显示在 div 中。我每 3000 毫秒刷新一次 DIV,刷新本身时 CPU 使用率仅高出几个百分点。经过 20-25 分钟的不断刷新后,当我单击其中一个链接时,打开该页面大约需要 20 秒,同时浏览器选项卡冻结。发生更多刷新 - 打开链接需要更多时间,以及打开更多链接时(如果打开 10-15 个链接,打开下一页的速度会慢到 10-12 秒)。当浏览器尝试打开链接时,1 个处理器线程已完全加载。这是代码(简化):

    <div id="map1"></div>

<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<div id="map1">

<?PHP


if (isset($_GET['m']))        

    $selectback = "SELECT parentid FROM MAP_LINK WHERE sysid = " . $_GET['m'];
    ................
    $rowb = ibase_fetch_row($query);        

    echo "<h6><a href=\"#\" id=\"back" . $rowb[0] . "\">BACK</a></h6><h4>
    <script>
       $('a#back" . $rowb[0] . "').click(function() 
           clearInterval(auto_refresh);    
               $(\"#map1\").load(\"test2.php?m=" . $rowb[0] . "\");

               auto_refresh = setInterval(function ()
               $(\"#map1\").load(\"test2.php?m=" . $rowb[0] . "\");, 3000);

               );
               </script>";





     $select = "SELECT sysid FROM MAP_LINK WHERE parentid = " . $_GET['m'];
     .........................................                   

    $x = 0;
    while ($x < $total_rows) 
        $x++;
        $row = ibase_fetch_row($query);
        echo "<br><a href=\"#\" id=\"" . $row[0] . "\">Link # " . $row[0] . "</a>
        <script>
                $('a#" . $row[0] . "').click(function() 
                 clearInterval(auto_refresh);    
               $(\"#map1\").load(\"test2.php?m=" . $row[0] . "\");

               auto_refresh = setInterval(function ()
               $(\"#map1\").load(\"test2.php?m=" . $row[0] . "\");, 3000);

               );
        </script>";

    
 else 
    echo "<script>
$(document).ready(function()
$(\"#map1\").load('test2.php?m=56');
auto_refresh = setInterval(function ()
$(\"#map1\").load(\"test2.php?m=56\");, 3000);
);</script>";

?>

这与我的代码大致相同。该数据库由 4 个从中提取数据的表组成。前 6 到 7 次点击会立即打开下一页,没有延迟,第 10 次点击后延迟开始,并随着每次点击或刷新而变大。

我的问题是:如何让它立即或至少更快地打开?代码中有错误。它可以工作,但它会大量使用 CPU,而且速度越来越慢,无法在页面上导航。

谢谢!

【问题讨论】:

可能en.wikipedia.org/wiki/Reentrancy_(computing)不要使用setInterval,使用setTimeout,工作完成后重新订阅循环。这将确保函数永远不会重新进入。 你在一个while循环中回显间隔,谁知道你同时运行了多少个间隔? 如果你按下它,每次+1都会触发auto_refresh。 将在周一尝试将 setInterval 替换为 setTimeout,看看是否有帮助。谢谢 setTimeout 只刷新一次页面。我需要每 x 秒刷新一次,直到点击链接。 【参考方案1】:

迟到了,但您可以尝试将 setTimeouts 链接在一起,如下所示:

function refreshments() 
    setTimeout(function()
        //Do stuff
        refreshments();
    , 1000);


refreshments();

【讨论】:

以上是关于JavaScript setInterval 后 CPU 使用率高的主要内容,如果未能解决你的问题,请参考以下文章

请问javascript里var a=setinterval后在函数中清除再设定a返回值不停增加?

JavaScript 函数 setTimeout() 和 setInterval() 有时不工作

setTimeout和setInterval的用法

JavaScript使用setInterval()函数作简单的轮询操作

JavaScript计时事件

JavaScript计时器