Javascript 如何使闭包编译器在大型项目中通过高级优化删除所有死代码?

Javascript 如何使闭包编译器在大型项目中通过高级优化删除所有死代码?,javascript,compiler-construction,google-closure-compiler,dead-code,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(functio

以下代码:

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() {});
闭包编译器对此进行了优化:

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()); 
(它留下了死代码。)

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


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

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


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

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


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

可能?不确定这是否是一个bug。有人能确认这是一个bug吗?也许我遗漏了什么?也许?不确定这是否是一个bug。有人能确认这是一个bug吗?也许我遗漏了什么?谢谢你的澄清,它看起来很像。如何修改闭包编译器的源代码来更改启发式,以便它尝试内联代码?(因为它将有助于删除死代码。)InlineFunctions.java是寻找更改启发式的地方,我们没有发现需要调整它,因此没有显式的编译器选项来调整启发式。感谢您的澄清,它看起来类似于。如何修改闭包编译器的源代码来更改启发式,以便它尝试内联代码?(因为它将有助于删除死代码。)InlineFunctions.java是寻找改变启发式的地方,我们没有发现需要调整它,因此没有明确的编译器选项来调整启发式。