【问题标题】:Disable infinite loop protection in codepen.io在 codepen.io 中禁用无限循环保护
【发布时间】:2015-09-15 16:22:34
【问题描述】:

是否可以在 codepen.io 中禁用无限循环保护?

JSBin 有// noprotect

能够运行代码无需编辑器进行任何添加就很好,例如。在测量执行时间等时。

当我运行 CPU 分析器时,会调用 window.CP.PenTimer.shouldStopLoop(),这可能会导致测量执行时间时出错。

在 JSBin 中完全相同的代码运行 1000 毫秒,但在 codepen.io 中执行时间是 4000 毫秒。这使得 codepen.io 不太适合运行繁重的循环。

例子:

// noprotect
var len = 2000000;
var a = [];
var t = performance.now();
while(len--)
{
  a.push((len%7)*Math.atan2(len,-len));
}
t = performance.now() - t;
document.write(t);

在 Codepen 中: http://codepen.io/timo22345/pen/yYedmo 4202.92 毫秒(Chrome 45 OSX)

在 JSBin 中: http://jsbin.com/xufesa/2/edit?html,css,js,output 1082.03 毫秒(Chrome 45 OSX)

这种巨大的减速使 codepen.io 成为一个不错的文本编辑器(在某种程度上它比 JSBIN 更接近桌面文本编辑器,因为 例如。 tab 键按预期工作,可以在其中搜索 iframes),但在代码处于最终状态后,您必须将其移至 JSBin 或其他服务器运行代码 - 如果非限制速度是 重要的事情。

至少一些警告可以避免完全错误的性能测量和错误的结论。参见例如。 http://www.sitepoint.com/measuring-javascript-functions-performance/ 其中作者使用 codepen.io 测量各种函数的性能,并在测量执行时间后发现使用 forEach 的函数运行速度明显快于使用普通 for 循环的函数。他的结论是:

解释简单但微妙。使用 haystack.forEach 的第一个函数受益于浏览器 JavaScript 引擎中的一些低级优化,这是我们使用数组索引技术时无法获得的。它证明了我们的观点:你永远不会知道,直到你测量它!

Vyacheslav Egorov 认为这不是真的:

一个更明显的解释是实验出了点问题......确实如此:如果你将调试器语句放入 for 循环中,你会发现 CodePen 使用抢占检查进行循环(以防止无限循环我猜是从杀死 UI 开始)。这些检查如下所示:

if (window.CP.shouldStopExecution(1)) {
  break;
}

【问题讨论】:

  • 你可以看看this文章
  • 你需要无限循环做什么?也许您正在寻找将递归函数与 requestAnimationFrame 一起使用。
  • @KarolisRamanauskas:我不需要无限循环。编辑-调试-编辑时保护很好,但是当我确定循环不是无限的时,我会想删除保护。但是我在codepen.io中没有找到方法。 rAF 在渲染某些东西时很好,但它不适合不渲染任何东西的循环。
  • @MaxZoom:在提供的链接中,我没有找到禁用保护的方法。

标签: javascript editor


【解决方案1】:

你可以使用:

window.CP.PenTimer.MAX_TIME_IN_LOOP_WO_EXIT = Number.POSITIVE_INFINITY;

参考:Codepen blog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多