我是否以这种方式每秒获得多少次操作?

时间:2016-12-23 20:07:39

标签: javascript loops while-loop

看看这段代码:

function wait(time) {
    let i = 0;
    let a = Date.now();
    let x = a + (time || 0);
    let b;
    while ((b = Date.now()) <= x) ++i;
    return i;
}

如果我以wait(1000)之类的方式在浏览器中运行它(特别是谷歌浏览器,但我认为不重要),机器显然会冻结一秒,然后返回重新计算的值{ {1}}。
设为i(我得到的值接近此值)。这个值每次都有所不同,所以我们取一个平均数。

我的机器每秒处理器的当前操作次数是多少?

3 个答案:

答案 0 :(得分:2)

完全没有。

你得到的是在一定时间内Javascript进程完成的循环周期数。每个循环周期包括:

  • 创建新的 dist_bin_SCRIPTS = your_perl_program 对象
  • 比较两个Date个对象
  • 增加Date

增加Number变量Number可能是其中最便宜的,因此该函数并未真正报告实现增量需要多少。

除此之外,请注意该机器比运行Javascript进程要多得多。您将看到同时在计算机中发生的各种活动的干扰。

在Javascript过程中运行时,您只需离开处理器(就软件层而言)太远而无法进行测量。在Javascript下面,有浏览器和操作系统,每个浏览器和操作系统都可以(并且将会)做出影响此结果的决策。

答案 1 :(得分:1)

没有。您可以获得每秒语言操作的数量,但整个处理器上每秒的实际机器操作数量更复杂。

首先,处理器并非完全专用于浏览器,因此它实际上可能在优先级进程之间来回切换。最重要的是,内存访问被遮挡,处理器使用额外的操作来管理内存(页面刷新等),这在给定时间对您来说不是很透明。最重要的是,物理属性意味着处理器的实际时钟速率是动态的...你可以看到它已经相当复杂了;)

要真正计算每秒的机器操作次数,您需要测量处理器的时钟速率,并将其乘以处理器可执行的每个周期的指令数。这种情况再次变化,但实际上制造商的规格可能已经足够估计了:P。

如果您想使用程序来衡量这一点,您需要以某种方式将100%的处理器专用于您的程序,并让它运行一组可预测的指令而不会有其他挂断(如内存管理)。然后,您需要包含将程序指令加载到代码缓存中所需的指令数。然而,这并不可行。

答案 2 :(得分:0)

正如其他人所指出的那样,由于先前的答案指出的因素,这无法帮助您确定处理器每秒执行的操作数。但我认为可以设置类似的实验来估计您的浏览器上运行的JavaScript解释器要执行的操作数。例如,给定一个函数:factorial(n)O(n)中运行的操作。您可以在一分钟内重复执行factorial(100)等操作。

function test(){
  let start = Date.now();
  let end = start + 60 * 1000;
  let numberOfExecutions = 0;
  while(Date.now() < end){
     factorial(100);
     numberOfExecutions++;
  }
  return numberOfExecutions/(60 * 100);
}

这里的想法是,factorial是代码中最耗时的函数。因为O(n)中的阶乘运行,我们知道factorial(100)大约有100个操作。请注意,这不会是准确的,更大的数字将使更好的近似值。还要记住,这将估算解释器执行的操作数,而不是处理器。