Устранение мертвого кода Java ... рискует ли этот код быть оптимизированным? - PullRequest
3 голосов
/ 24 февраля 2011

Итак, я использую API, который в некоторых отношениях немного недружелюбен. По сути, этот API создает ресурс, который можно получить позже. Этот ресурс может существовать, а может и не существовать, когда мы пойдем за ним позже.

Чтобы получить ранее созданный ресурс, вы должны использовать guid результата, например, так:

String resultKey = "12345";
PersistedResult r = mFactory.getPersistedResult(resultKey);

Теперь хитрость заключается в том, что getPersistedResult НЕ выдает исключение при вызове с недопустимым guid ... PersistedResult является отложенным загрузчиком и завершится ошибкой только при вызове одного из его методов (вызывая объект загрузить себя).

Итак, чтобы попытаться определить, является ли ресурс действительным, я делаю следующее:

PersistedResult r = null;

if (!StringUtils.isEmpty(resultKey)) {
    try {
       r = mFactory.getPersistedResult(resultKey);
       r.getResultCount(); // Triggers exception if result key was invalid.    
    } catch (Exception e) {
       // handle exception
    }
 }

Может ли мой вызов на getResultCount рискнуть быть оптимизированным, потому что я не использую значение?

Вызов любого метода на PersistedResult отправляется во внешнюю базу данных, на всякий случай, если это имеет значение.

Спасибо

Ответы [ 4 ]

7 голосов
/ 24 февраля 2011

Компилятор не может предположить, что getResultCount () не имеет побочных эффектов - поэтому он не может удалить вызов.

3 голосов
/ 24 февраля 2011

Оптимизация во время выполнения (или во время компиляции, то же самое) не может дать вам другие результаты, чем это было бы, когда ничего не оптимизировано (кроме времени выполнения или экономии памяти).Если здесь ваше исключение не выдается из-за оптимизации, это определенно другое поведение и, следовательно, будет ошибкой.

(Обратите внимание, что в многопоточных средах это немного смягчается, когда речь идет об отношениях между различными потоками.)

3 голосов
/ 24 февраля 2011

Нет, с чего бы это? Либо getResultCount не будет встроенным, в этом случае это черный ящик и должен быть выполнен, потому что он может делать все что угодно, или он будет встроенным, и в этом случае компилятор может увидеть, что он потенциально может вызвать исключение, и выполнит это действие.

Тот факт, что он имеет возвращаемое значение, не имеет значения. Если бы это было фактором, любая функция любой сложности была бы подвержена риску оптимизации, если бы вызывающая сторона не проверяла возвращаемое значение.

1 голос
/ 24 февраля 2011

Нет.Поскольку оптимизация не может изменить семантический кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...