1

I was wondering if javascript calculate (again) same expressions as it encounters them :

for example :

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

it's hard to test it like it but I thought that all the +/-1 will take it some time ( a tick) so I could see a difference.

But the answer is 0.

So ,

Is it zero because its just too fast or because JS treats the first new Date() as the same as the later one ?

4

4 回答 4

6

GetTime()返回自 Unix 纪元以来的毫秒数。鉴于理论上在现代处理器(运行数十亿次浮点数)上加法只需要一个 FLOP,我会说处理器极有可能在不到一毫秒的时间内简单地执行整个语句。

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

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

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

于 2013-05-26T10:55:06.213 回答
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);

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

于 2013-05-26T10:57:02.663 回答
2

回答您问题的症结所在,其他答案似乎缺失;不,这两个调用不可能new Date()被优化成同一个东西。这两个单独的调用返回不同的对象,引擎将两个不同的调用简单地优化为一个调用将是完全无效的。

例如,考虑一下,如果您使用返回新Date对象的不同方法执行此操作,但此方法包含 20 秒延迟(或每次调用增加的返回值) - 这两个getTime结果应该相隔数千个刻度,但您的提议的“优化”将导致它们返回相同的值。

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

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

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

于 2013-05-26T11:05:06.047 回答
1

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

于 2013-05-26T10:55:28.100 回答