4

我正在一个网站上工作,其中包含一些有趣的 Javascript,我担心它可能会导致速度较慢的机器出现性能问题。

该脚本使用 setInterval 每隔一秒运行一次处理程序。处理程序执行以下操作:

  1. 读取单个 cookie 值(使用 jquery cookie 插件)
  2. 更新其价值和到期日期
  3. 写回饼干罐

cookie 有一个到期日期,因此理论上应该每次都将其写入磁盘,而不是保存在内存中。

到目前为止,它在我的 PC 上运行良好,但我有一台带有固态驱动器的快速机器。您认为这种设计会导致速度较慢的盒子或繁忙的硬盘出现问题吗?可能导致每 1 秒发生一次轻微的口吃效果?只是在寻找一些保证,即这种设计并非绝对疯狂。谢谢。

4

1 回答 1

6

在浏览器中,JavaScript 执行是单线程的。这意味着,当 JS 代码运行时,setInterval函数不会运行。同样,当setInterval函数运行时,其他 JS 代码(例如事件处理程序)将不会运行。

因此,确保以短时间间隔运行的代码运行良好当然很重要。

在这种情况下,您的代码每秒运行一次,因此它需要 << 1 秒才能完成很重要,否则您将冒着永远不会留下足够时间让其他操作发生的风险。

这里有一些关于使用 jQuery(和没有)访问 cookie 的性能数据

它表明读写速度足够快,你应该能够做到这一点,而不会占用太多的 1 秒更新间隔。

另一种方法可能是尝试以下

var timeoutId;
var timeoutSetter = function(timeout) {
    timeoutId = setTimeout(function() {
        cookieUpdate();
        timeoutSetter(timeout);
    }, timeout);
};

timeoutSetter(1000);

这意味着,无论更新本身需要多长时间,cookie 都不会在上次更新后的 1 秒内更新……可能有点矫枉过正,它会导致一些相当粗糙的代码,但它是一种选择。

更新

在下面Bergi的评论之后,我认为一个例子会很有启发性。

转到http://jsfiddle.net/meYc5/2/并打开控制台。Foo clicked每次单击黄色框时,您都会看到一个日志。如果您反复单击,您会看到它从黄色变为红色并返回。有明显的延迟。这是因为它当前配置为setInteval每秒阻塞线程 500 毫秒。这意味着以 50% 的占空比处理事件。

此外,您会注意到文本区域中的光标反应较慢。

这(500 毫秒)对于更新 cookie 来说是一个相当长的时间,但它说明了原理。如果你正在做某事setInterval,你应该确保

execution time of the handler << interval period

以便您保持足够高的占空比来处理事件。

于 2013-10-03T02:13:37.417 回答