【发布时间】: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