Ich bezweifle, dass es eine Möglichkeit gibt, Bedingungen zur Kompilierungszeit in Java wie #ifdef #ifndef in C ++ zu erstellen.
Mein Problem ist, dass ein Algorithmus in Java geschrieben ist und ich andere Laufzeitverbesserungen zu diesem Algorithmus habe. Ich möchte also messen, wie viel Zeit ich spare, wenn jede Verbesserung verwendet wird.
Im Moment habe ich eine Reihe von booleschen Variablen, mit denen während der Laufzeit entschieden wird, welche Verbesserung verwendet werden soll und welche nicht. Aber selbst das Testen dieser Variablen beeinflusst die Gesamtlaufzeit.
Daher möchte ich herausfinden, wie ich während der Kompilierungszeit entscheiden kann, welche Teile des Programms kompiliert und verwendet werden sollen.
Kennt jemand einen Weg, dies in Java zu tun. Oder vielleicht weiß jemand, dass es keinen solchen Weg gibt (es wäre auch nützlich).
javac
ich denke entfernt. Dies funktionierte nur, wenn der Ausdruck für (sagen wir)enableFast
ein Ausdruck für die Kompilierungszeitkonstante war.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac gibt keinen kompilierten Code aus, der nicht erreichbar ist. Verwenden Sie eine endgültige Variable, die auf einen konstanten Wert für Ihre
#define
und eine normaleif
Anweisung für die festgelegt ist#ifdef
.Sie können javap verwenden, um zu beweisen, dass der nicht erreichbare Code nicht in der Ausgabeklassendatei enthalten ist. Betrachten Sie beispielsweise den folgenden Code:
javap -c Test
gibt die folgende Ausgabe aus, die angibt, dass nur einer der beiden Pfade kompiliert wurde (und die if-Anweisung nicht):quelle
Ich denke, dass ich die Lösung gefunden habe. Es ist viel einfacher.
Wenn ich die booleschen Variablen mit dem Modifikator "final" definiere, löst der Java-Compiler selbst das Problem. Weil es im Voraus weiß, was das Ergebnis des Testens dieses Zustands sein würde. Zum Beispiel dieser Code:
läuft ca. 3 Sekunden auf meinem Computer.
Und das hier
läuft ca. 1 Sekunde. Die gleiche Zeit, die dieser Code benötigt
quelle
Ich habe es nie benutzt, aber das gibt es
http://www.anarres.org/projects/jcpp/
quelle
Wenn Sie wirklich eine bedingte Kompilierung benötigen und Ant verwenden , können Sie möglicherweise Ihren Code filtern und darin suchen und ersetzen.
Zum Beispiel: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
Auf die gleiche Weise können Sie beispielsweise einen Filter schreiben, durch den ersetzt
LOG.debug(...);
werden soll/*LOG.debug(...);*/
. Dies würde immer noch schneller alsif (LOG.isDebugEnabled()) { ... }
alles andere funktionieren, ganz zu schweigen davon, dass es gleichzeitig prägnanter ist.Wenn Sie Maven , gibt es eine ähnliche Funktion beschrieben hier .
quelle
Manifold bietet einen vollständig integrierten Java-Präprozessor (keine Erstellungsschritte oder generierte Quelle). Es zielt ausschließlich auf die bedingte Kompilierung ab und verwendet Anweisungen im C-Stil.
quelle
Verwenden Sie das Factory-Muster, um zwischen Implementierungen einer Klasse zu wechseln.
Die Objekterstellungszeit kann jetzt kein Problem sein, oder? Im Durchschnitt über einen langen Zeitraum sollte der größte Teil der aufgewendeten Zeit im Hauptalgorithmus liegen, nicht wahr?
Genau genommen brauchen Sie keinen Präprozessor, um das zu tun, was Sie erreichen möchten. Es gibt höchstwahrscheinlich andere Möglichkeiten, Ihre Anforderungen zu erfüllen, als die, die ich natürlich vorgeschlagen habe.
quelle
quelle