我想知道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()视为与后一个相同?
答案 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计算可能会被优化掉。