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

Is it possible that Javascript keep same expression value?

本文关键字:表达式 是否 Javascript      更新时间:2023-09-26

我想知道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将需要一些时间(一个tick),所以我可以看到一个差异。

但答案是0。

它是零,因为它只是太快,还是因为JS把第一个新的日期()作为相同的后一个?

GetTime()返回自Unix纪元以来的毫秒数。考虑到在理论中,一个加法在现代处理器上只需要一个FLOP(运行在数十亿个FLOPS),我想说处理器极有可能在不到一毫秒的时间内执行整个语句。

当然,真正测试这一点的方法是在一个循环中运行数十亿次,让大数定律来解决剩下的问题。为了使事情变得更简单,您还可以尝试使用任意大的数字交替使用乘法和除法,以使执行时间更长。

无论如何,请记住,一般来说,语言不会倾向于优化函数,除非它总是或几乎总是有意义的。在您的特定情况下,程序如何能够合理地假设您没有尝试测量算术所需的时间?如果将单行语句分解为几个更小的语句呢?你也会做同样的事…在这种情况下,日期/时间函数的行为不同是否合理?

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

是的,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);

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

回答你的问题的关键,而其他的答案似乎都遗漏了;不,这是不可能的,这两个调用new Date()被优化成相同的东西。这两个单独的调用返回不同的对象,对于引擎来说,简单地将两个不同的调用优化为一个调用是完全无效的。

考虑一下,例如,如果你用一个不同的方法来做这件事,这个方法返回一个新的Date对象,但是这个方法包含了一个20秒的延迟(或者每次调用一个递增的返回值)——两个getTime结果应该相隔数千个滴答,但是你提议的"优化"将使它们返回相同的值。

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

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

所以,是的,这是因为调用间隔不到一毫秒完成。

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