看看这段代码:
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
(我得到的值接近此值)。这个值每次都有所不同,所以我们取一个平均数。
我的机器每秒处理器的当前操作次数是多少?
答案 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个操作。请注意,这不会是准确的,更大的数字将使更好的近似值。还要记住,这将估算解释器执行的操作数,而不是处理器。