有意放慢 Javascript 解释器的可能性是否存在?

4
我想让我的浏览器执行JavaScript代码变慢。有没有浏览器插件或其他工具可以做到这一点?
背景:我想展示给学生们在某个浏览器游戏中执行时间对游戏性能的影响。这个游戏的速度完全取决于其代码的执行时间,就像早期的MS-DOS游戏一样。为了向学生们展示这种编码方式的影响(取决于CPU周期而不是时间),如果我能够减缓代码的执行速度,那将非常棒。
你有什么想法吗?
谢谢!

也许你可以对处理器进行降频操作。 - Oriol
2
你能不能写一些故意浪费时间的代码呢? - Rune FS
你可以在浏览器旁边运行一个CPU密集型任务(例如一些基准测试工具),或者你可以探索一种限制特定进程的方法,但这取决于你使用的操作系统。 - hanzi
2
也许在虚拟机中运行它并为其提供非常少的资源就足够了。例如,Virtual Box 允许为特定的虚拟机设置 CPU 执行限制 - http://superuser.com/questions/265322/limiting-cpu-speed-in-a-virtual-machine - tiblu
我认为一个计时器是你正在寻找的东西。检查jquery的animate函数,以获取一个旧但不错的例子 http://blog.bigbinary.com/2010/01/25/how-animate-really-works-in-jquery-simple-animation-case-discussed.html - edigu
3个回答

1
这似乎是JavaScript中实际睡眠函数的一个适当用例 - 只需在代码中放置一个忙等循环,直到时间发生变化即可。
function sleep(µs) {
     var end = performance.now() + µs/1000;
     while (end > performance.now()) ; // do nothing
}

@Mathletics:因为performance.now具有微秒级别的精度。但你说得对... - Bergi
2
将一个值以其单位命名似乎是个不好的主意。µs/1000并不等同于(x/1000)µs。 - Lightness Races in Orbit

1

这段代码将尽可能快地绘制/循环

function loop() {
  draw();
  loop();
}

这段代码会在每个循环周期中人为地增加约100毫秒的时间。
function loop() {
  draw();
  setTimeout(loop, 100);
}

在创建类似这样的循环时,我使用的是一个精确计算的增量(delta),以便进行准确的计算。

function draw(delta) {
  console.log("%f ms", delta);
}

function loop(last) {
  var now = performance.now();
  var delta = now - last;
  draw(delta);
  setTimeout(function() { loop(now); }, 100);
}

loop(0);

// 102.51500000001397 ms
// 102.38000000000466 ms
// 105.33499999996275 ms
// 101.27500000002328 ms
// 103 ms
// 100.88000000000466 ms
// 100.9649999999674 ms
// 100.69500000000698 ms
// 102.01500000001397 ms
// 105.85499999998137 ms

正如您所看到的,draw函数每100毫秒被调用一次。这大约是每秒10帧。现在,您可以使用此delta值进行精确计算,例如动画序列或定位移动元素。
你可以轻松地将这个值作为循环的变量。
function framesPerSecond(x) {
  return 1e3/x;
}

function draw(delta) {
  console.log("%f ms", delta);
}

function loop(fps, last) {
  var now = performance.now();
  var delta = now - last;
  draw(delta);
  setTimeout(function() { loop(fps, now); }, fps);
}

loop(framesPerSecond(25), 0); // 25 frames per second
// 42.8150000000023 ms
// 42.1600000000035 ms
// 44.8150000000023 ms
// 41.8299999999872 ms
// 43.195000000007 ms
// 41.7250000000058 ms
// 42.1349999999802 ms
// 43.0950000000012 ms

现在你可以非常容易地模拟任何帧速率

loop(framesPerSecond(0.5), 0); // 1 frame per 2 seconds
// 2001.58 ms
// 2002.705 ms
// 2005.9 ms
// 2001.665 ms
// 2002.59 ms
// 2006.165 ms

注意:draw 函数运行时间较长时,framesPerSecond 的准确性会受到影响。您可以通过测量每个周期中 draw 运行的持续时间,并从 fps 延迟中减去该时间来改进此问题。


0
创建一个函数来计算斐波那契数列(限制最大值以避免浏览器崩溃),并在其他函数之间调用它:
function fibo(max) {
    var x = 0;
    for (var i = 0, j = 1, k = 0; k < max; i = j, j = x, k++) {
        x = i + j;
    }
}

然后在其他函数调用之间调用它:

doSomething();
fibo(15);
doSomethingElse();
fibo(15);
doSomethingElseElse();
fibo(15);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接