2010-12-10 2 views
4

Вызывают ли вызовы System.out.println (...) какие-либо эффекты, если оставить их в коде BlackBerry или на любом другом языке программирования?Комментирование System.out.println

При удалении время компиляции может быть уменьшено, но есть ли какая-либо другая причина для их удаления?

ответ

4

Есть несколько вещей, которые вы должны знать, прежде чем использовать System.out.println() на Blackberry:

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

  2. Накладные расходы на производительность, которые делает сам System.out.println(), минимальны, особенно если выходной поток не привязан ни к чему (т. Е. Устройство не подключено, а не в режиме отладки).

Я сам скорее использую препроцессор Blackberry, чтобы иметь возможность отключать все журналы перед выпуском. По этой причине я определить директиву протоколирования LOGGING, а затем в моем коде:

//#ifdef LOGGING 
System.out.println("LOGGING is enabled"); 
//#endif 

Более подробную информацию о том, как использовать препроцессор в Blackberry плагин Eclipse см this.

-4

Это не объект, и к нему не привязано никакой памяти, поэтому не должно быть никакого эффекта, кроме времени его запуска и компиляции. И, конечно, читаемость может быть lol

+1

Я бы подумал, что строки, которые он выводит *, могут фактически взять некоторую память, как в байте-коде, так и во время выполнения. `System.out.println ('эта строка фактически занимает 0 байт в памяти?');` – Piskvor 2010-12-10 13:21:26

+0

`System.out.println` будет принимать параметр String as. Эта строка нуждается в памяти, и для создания строки потребуется некоторое время. (-1) – 2010-12-10 13:23:39

+2

Ответы людей вниз, которые, по их мнению, неверны. Таков характер системы. Если этот факт обескураживает, тогда вы, возможно, не очень хорошо подходите сюда. – Will 2010-12-10 14:47:23

1

Я предпочитаю использовать флаг для отключения sysouts. Sysouts очень медленны, если вы используете их много, например. в петлях.

1

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

Кроме того, если вы передаете String в качестве аргумента, это займет некоторое место в байт-коде и в памяти. Вам на вашем аппарате с 173 PB RAM может быть все равно, но есть системы с ограниченными ресурсами (например, мобильные устройства).

1

Если вы не собираетесь использовать выходные данные для чего-то вроде отладочного ect. то лучше всего это вытащить. Ваша программа будет работать только так быстро, как линия может быть выведена, поэтому теоретически, чем меньше у вас на линии system.out, тем быстрее будет процесс.

Надеюсь, это поможет.

1

Вы должны использовать Ant для предварительной обработки этих строк из исходного кода. (Убедитесь, что ни один из них не имеет побочных эффектов!)

1

Я не знаю конкретно о Blackberry, но если ваша программа пишет неизвестное устройство (то есть вы не знаете, где идет стандартная версия), там может быть потенциальным для вашего приложения время от времени/спорадически/необъяснимо блокировать мгновенно в попытке написать.

1

Создайте свой собственный метод, то есть:

public static void consoleMessage(String msg){ 
    if(DEBUG_FLAG){ 
    System.out.println(msg); 
    } 
} 

Затем использовать только это на протяжении всего кода. Это сэкономит вам время на изменение всех линий.

1

использовать что-то вроде Log4J вместо системы из печати заявления, это дает вам гораздо больше гибкости

1

Поддержание System.out утверждений не так уж плохо, что обычно делать. Пользователи могут видеть их, чтобы они не всегда выглядели хорошо в производственной среде. Лучше всего использовать систему каротажа, такую ​​как java.util.logging или log4j. Они могут быть сконфигурированы для выгрузки вывода на консоль, в файл, базу данных, webservice ...

Имейте в виду, что только потому, что вы не видите результат, это не означает, что никакая работа не работает выполняется во время выполнения. JVM все еще должен создать String для передачи в system.out (или оператор журнала), который может принимать справедливый бит памяти/CPU для больших/сложных объектов, таких как коллекции.

0

Операторы Sysout получают доступ к синхронизированному общему ресурсу, который вызывает synchronization между потоками, использующими его. Это может предотвратить ошибки memory consistency в многопоточных программах, если нет другого кода, который обеспечивает синхронизацию. Когда инструкции sysout удаляются, все существующие ошибки целостности памяти в коде могут отображаться в первый раз.

Для примера этого эффекта см .: Loop doesn't see changed value without a print statement.

Смежные вопросы