【发布时间】:2012-02-28 18:17:59
【问题描述】:
最近有人告诉我这很糟糕:
var el = $("#myID");
$(el).addClass("a");
$(el).addClass("b");
$(el).addClass("c");
并且它应该像这样被缓存:
var $el = $("#myID");
$el.addClass("a");
$el.addClass("b");
$el.addClass("c");
所以,我的问题是,为什么不自动优化?在 Java 和其他语言中,我认为编译器足够聪明,可以自己进行缓存。
也就是说,这个:
// myList is a List<String>
String str = myList.get(0);
String trimmed = str.trim();
String sub = str.substring(0, 5);
boolean abc = str.startsWith("abc");
没有比这更有效的:
String trimmed = myList.get(0).trim();
String sub = myList.get(0).substring(0, 5);
boolean abc = myList.get(0).startsWith("abc");
任何了解编译器的人都可以在这里给我一些见解吗? JavaScript 就这么愚蠢吗?或者对于 Java/其他也是如此?
【问题讨论】:
-
虽然编译器可能有足够的信息来推断函数是纯的(此外,它并不依赖于 DOM - 它需要更多信息,例如知道在调用之间没有发生 DOM 操作,这已经失控了),很少有人真正尝试过。 Java 编译器是故意愚蠢的,而 JIT 编译器(用于 Java 和 JS)更受编译时间的限制。他们通常坚持不需要大量分析的最有利可图的优化(例如,推测性地删除虚拟调用,或者在 JS 中为某些变量假定静态类型)。
-
如果你关心简洁,使用jquery的语法糖:
$("#myID").addClass("a").addClass("b").addClass("c");这样你的代码就不必维护这个变量了,它会更快地超出范围。 -
@bert 是的,显然......这只是一个玩具示例。
标签: java javascript caching compiler-construction