Angenommen, ich verwende C++. Jetzt habe ich den folgenden Code:Wie kann die Leistung optimiert werden, ohne dass das DRY-Prinzip (Do not-Repeat-Yourself) in diesem Szenario verletzt wird?
int flag;
// ...
while (!TimeToExitLoop()) {
Func();
}
Die while
Schleife eine große Anzahl von Malen ausgeführt werden, und Func
ist eine zeitkritische Funktion wie folgt aus:
void Func() {
// some big stuff ...
if (flag > 1) {
// logic 1 ...
}
else {
// logic 2 ...
}
}
Auch der Wert von flag
wird nicht innerhalb der while
Schleife geändert werden. Daher ist es besser, die bedingte if
Anweisung aus der while
Schleife zu bewegen, und definiert zwei separate Funktionen für die beiden Bedingungen wie folgen aus:
int flag;
// ...
if (flag > 1) {
while (!TimeToExitLoop()) {
Func_FlagBiggerThanOne();
}
}
else {
while (!TimeToExitLoop()) {
Func_FlagNoBiggerThanOne();
}
}
jedoch, die in der Wiederholung der „großen Sachen“ führen in Func
von Func_FlagBiggerThanOne
und Func_FlagNoBiggerThanOne
:
void Func_FlagBiggerThanOne() {
// big stuff ...
// logic 1 ...
}
void Func_FlagNoBiggerThanOne() {
// big stuff ...
// logic 2 ...
}
die die Einmalige Repeat-Yourself-Prinzip verstoßen wird. Wir können dieses "große Zeug" nicht in irgendeiner Funktion verwenden, weil das Aufrufen dieser Funktion zeitaufwendiger ist als die ursprüngliche if
-Anweisung. Eine der Lösungen besteht darin, ein Makro für diese großen Dinge zu definieren, aber was ist, wenn "logisch 1" und "logisch 2" die Variablen verwenden, die in "großen Dingen" definiert sind? Obwohl das Makro immer noch funktioniert, was zu einem hässlichen Code führen kann, könnte der Leser des Programms denken: "Wo zum Teufel sind diese Variablen definiert?"
Verwenden Sie einen Compiler/Linker, der die Bedingung aus der Schleife entfernen kann ... aber dieser Compiler/Linker muss ziemlich sein funky wenn 'Func' in einer anderen Datei ist, weil' flag' anscheinend global ist. – lijie
«Wir können dieses" große Zeug "nicht in irgendeiner Funktion verwenden, weil das Aufrufen dieser Funktion zeitaufwändiger ist als die ursprüngliche if-Anweisung. » Kannst du es nicht inline? – Zecc
Ich denke, ein guter Programmierer sollte vom Compiler/Linker nichts annehmen. Auch, Zecc, ich denke, inline wird nicht funktionieren, weil das Zeug sehr "groß" ist. –