Javascript是否可能保持相同的表达式值?

时间:2013-05-26 10:50:47

标签: javascript

我想知道javascript是否会(再次)计算与遇到它们相同的表达式:

例如:

alert(new Date().getTime()+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1-new Date().getTime())

output : 0

很难对它进行测试,但我认为所有+/-1都会花费一些时间(刻度),所以我可以看到差异。

但答案是0。

所以,

它是零是因为它太快还是因为JS将第一个新Date()视为与后一个相同?

4 个答案:

答案 0 :(得分:6)

GetTime()返回自Unix纪元以来的毫秒数。鉴于在理论中,在现代处理器(在数十亿FLOPS中运行)中只添加一个FLOP,我会说处理器极有可能只在少于执行整个语句时执行一毫秒。

当然,真正测试这种方法的方法是在循环中运行数十亿次,让大数法则解决其余问题。为了使事情变得更容易,您还可以尝试使用交替乘法和除以任意大的数字来使执行时间更长。

无论如何,请记住,一般来说,语言不会优化功能,除非它始终或几乎总是有意义。在您的具体情况下,程序如何合理地假设您没有尝试测量算法需要多长时间?如果将单行语句分解为几个较小的语句怎么办?你会做同样的事情......在这种情况下,日期/时间函数采取不同的行动是否合理?

简而言之,我可以想到许多情况,其中缓存日期/时间会导致程序执行中出现严重问题。我无法想象缓存提供的无限小的性能提升将弥补它们。

答案 1 :(得分:2)

是的,10 +次操作和10次-操作可能不会花费一毫秒。你可以这样测试:

var c = (new Date().getTime() + calc() - new Date().getTime());

function calc() {
    for (var i = 0; i < 100000000; i++) {}
    return 0;
}

console.log(c);

你真的会得到一个不等于零的输出。

答案 2 :(得分:2)

回答你的问题的关键,其他答案似乎缺失了;不,对new Date()的两次调用不可能被优化为同一个东西。这两个单独的调用返回不同的对象,并且引擎只需将两个不同的调用优化为一个调用就完全无效。

例如,考虑一下,如果您使用返回新Date对象的其他方法完成此操作,但此方法包含20秒的延迟(或每次调用递增的返回值) - 两个{ {1}}结果应该是数千个刻度,但您提出的“优化”会导致它们返回相同的值。

如果getTime函数返回1到10,000之间的随机整数怎么办?

引擎无法知道两个调用应该返回相同的值(顺便说一句,它们不应该),而不知道返回值应该是什么,为了知道这一点,它会无论如何都必须执行这两种方法。

所以,是的,这是因为呼叫完成时间不到一毫秒。

答案 3 :(得分:1)

这取决于JavaScript引擎。如果代码是预编译的,那么您的+/- 1计算可能会被优化掉。