Я расширяю и улучшаю Java-приложение , которое также выполняет длительный поиск с небольшим DSL (в деталях оно используется для Нахождения модели, да, в общем, NP-Complete).
Во время этого поиска я хочу показать небольшой индикатор выполнения на консоли.Из-за общей структуры DSL я не могу рассчитать общий размер пространства поиска.Поэтому я могу только вывести ход выполнения первого оператора «backtracking».
Теперь вопрос: я могу использовать флаг для каждого оператора backtracking, чтобы указать, что этот оператор должен сообщать о прогрессе.При оценке оператора я могу проверить флаг с помощью оператора if:
public class EvalStatement {
boolean reportProgress;
public EvalStatement(boolean report) {
reportProgress = report;
}
public void evaluate() {
int progress = 0;
while(someCondition) {
// do something
// maybe call other statement (tree structure)
if (reportProgress) {
// This is only executed by the root node, i. e.,
// the condition is only true for about 30 times whereas
// it is false millions or billions of times
++progress;
reportProgress(progress);
}
}
}
}
Я также могу использовать два разных класса:
- Класс, который ничего не делает
- Подкласс, который выполняет вывод
Это будет выглядеть так:
public class EvalStatement {
private ProgressWriter out;
public EvalStatement(boolean report) {
if (report)
out = new ProgressWriterOut();
else
out = ProgressWriter.instance;
}
public void evaluate() {
while(someCondition) {
// do something
// maybe call other statement (tree structure)
out.reportProgress(progress);
}
}
}
public class ProgressWriter {
public static ProgressWriter instance = new ProgressWriter();
public void reportProgress(int progress) {}
}
public class ProgressWriterOut extends ProgressWriter {
int progress = 0;
public void reportProgress(int progress) {
// This is only executed by the root node, i. e.,
// the condition is only true for about 30 times whereas
// it is false millions or billions of times
++progress;
// Put progress anywhere, e. g.,
System.out.print('#');
}
}
Теперь действительно вопрос (ы):
- Является ли Java-поиск метода для вызова быстрее, чем оператор if?
- Кроме того, будет ли интерфейс и два независимых класса быстрее?
Я знаю, что Log4J рекомендует поставитьоператор if вокруг log-вызовов, но я думаю, что основной причиной является построение параметров, особенно строк.У меня есть только примитивные типы.
EDIT : Я немного пояснил код (то, что часто называют ... использование синглтона здесь не имеет значения).
Кроме того, я сделал два долгосрочных прогона поиска, в которых оператор if, соответственно, вызов операции был обработан 1.840.306.311 раз на машине, не делающей ничего другого:
- Версия
if
заняла10 ч. 6 мин. 13 сек. (50,343 "ударов" в секунду) - Версия
or
заняла 10 ч 9 мин 15сек (50,595 "ударов" в секунду)
Я бы сказал, это не такдать реальный ответ, потому что разница в 0,5% заключается в погрешности измерения.
Мой вывод: они более или менее ведут себя одинаково, но основной подход может быть более быстрым в долгосрочной перспективе, как и предполагалКейн в ответах.