2010-11-28 2 views
6

Closure Compiler ist eine Funktion inlining, aber die Code-Größe ist kleiner, wenn diese Funktion nicht inline ist (ich interessiere mich nur für die Code-Größe - das ist für JS1k). Kann ich dem Compiler mitteilen, dass diese Funktion nicht inline sein soll?Ist es möglich, Google Closure-Compiler * nicht * bestimmte Funktionen inline zu machen?

Edit: Nur ein bisschen besser zu erklären, hier ist meine Funktion:

function lineTo(x,y) { 
    a.lineTo(x,y); 
} 

wo a in der Leinwand Kontext. Da es so viele s im Code gibt, lohnt es sich, diese Funktion zu verwenden. So ist mein Code 1019 Bytes (und alle lineTo s werden durch a.lineTo ersetzt).

function lineTo(x,y) { 
    a.lineTo(x,y); 
    console.log(); 
} 

die neue Linie zwingt den Compiler irgendwie diese Funktion nicht inline, die mir 993 Bytes gibt: Wenn ich die Funktion zu ändern. Wenn ich also die console.log(); loswerden könnte, würde ich weitere 14 Bytes sparen.

+1

http://code.google.com/intl/de/closure/compiler/docs/compilatio n_levels.html "Der Compiler funktioniert nur, wenn er feststellt, dass Inlining sicher und platzsparend ist." ... vielleicht ist das Dokument falsch oder es ist ein Bug im Compiler. – timdream

+0

@timdream Sehen Sie meine Bearbeitung - es sieht so aus, als würde es automatisch eine einzeilige Funktion inline, auch wenn Inlining die Größe im Vergleich zu verlassen erhöht. – Skilldrick

+0

Bekam es! Vielen Dank. – timdream

Antwort

4

Von the tutorial:

Wenn ... Sie feststellen, dass Closure Compiler Funktionen Entfernen Sie behalten möchten, gibt es zwei Möglichkeiten, dies zu verhindern:
* Bewegen Sie die Funktion der Code ruft in verarbeitet Abschluss-Compiler.
* Exportieren Sie die Symbole, die Sie behalten möchten.

Sie wollen wahrscheinlich die zweite, die discussed here ist, aber im Grunde nach unten explizit kommt es als window Eigenschaft zu setzen:

function foo() { 
} 
window['foo'] = foo; 

Für Ihre js1k Vorlage, dann würden Sie aus der letzten Zeile nur verlassen wie es nicht benötigt wird. Beachten Sie, dass Closure die Funktion immer noch umbenennt, aber wenn es beginnt, Ihre Symbole mit dem Namen a umzubenennen und von dort fortfährt, ist es unwahrscheinlich, dass Ihre Namen länger insgesamt werden.

Sie können es mit der online compiler service ausprobieren. Wenn Sie diese Paste in:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 
function hello(name) { 
    alert('Hello, ' + name); 
} 
hello('New user'); 

... das kompilierte Ergebnis ist

alert("Hello, New user"); 

Aber wenn Sie

window['hello'] = hello; 

... bis zum Ende hinzufügen, das kompilierte Ergebnis ist:

function a(b){alert("Hello, "+b)}a("New user");window.hello=a; 
+0

"Entfernen" ist das gleiche wie "Inlining?" –

+0

@Robert: Nein, sie bedeuten auch die Entfernung von toten Codes. Aber es verhindert auch Inlining. –

+1

Diese Art von Arbeiten.Ich bekomme so 995 Bytes, weil es 'window.lineTo = n;' in der Ausgabe erzeugt, was unnötig ist. – Skilldrick

Verwandte Themen