如何使闭包编译器在较大的项目中使用高级优化删除所有死代码?

时间:2013-05-21 10:18:43

标签: javascript compiler-construction google-closure-compiler dead-code

以下代码:

function f(a) { a.a = 5; return a; }
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});
f(function() {});

由Closure编译器优化为:

function a(){return function(){}}function b(c){c.a=5}b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a());b(a()); 

(它留下了死代码。)

但是,如果我删除最后一行(重复只调用24x),它将删除死代码。结果是空的。

如何在大型项目中强制Closure编译器删除所有死代码?

1 个答案:

答案 0 :(得分:4)

不同之处在于编译器是否决定内联“f”。一旦内联“(function(){})。a = 5”就是一个死表达式。在此之前,“f”是一个具有副作用的函数(它修改了它的参数)并且不能自行移除。

内联的决定是基于对内联是否会导致代码量更小的估计。在这种情况下,从24到25的变化是估计内联成本高于通过删除函数定义所节省的成本的转折点。