2012-05-05 1 views
3

Чтобы отладить наш код Android, мы поставили System.out.println(string), который сообщит нам, сколько раз функция была вызвана. Другим методом было бы поставить флаг и продолжать увеличивать его после каждого вызова функции. И затем в конце напечатайте окончательное значение флага на System.out.println(...). (практически в моем приложении функция будет называться тысячи раз)Ресурсы ЦП и циклы часов: System.out.println или Приращение флага

Мой вопрос: С точки зрения ресурсов процессора и тактовых циклов которых один легче: операции приращения или System.out. Println?

ответ

3

Приращение будет намного, много более эффективно - особенно если у вас на самом деле есть место для выхода. Подумайте обо всех операциях, которые требуются System.out.println, и увеличивая переменную. Конечно, будет ли воздействие действительно значащим - это другое дело - и если ваш метод уже много работает, то вызов System.out.println не может иметь большого значения. Но если вы просто хотите знать, сколько раз он был вызван, то сохранение счетчика имеет больше смысла, чем просмотр журналов, в любом случае, IMO.

Я бы рекомендовал использовать AtomicLong или AtomicInteger вместо простой примитивной переменной, так как вы получите простую безопасность потоков.

+0

Спасибо за ваш ответ с ясностью. Я думаю, что атомные операции будут дорогостоящими (мое приложение однопоточное) ... – gpuguy

+1

@gpuguy: Вы * думаете *, или вы сравнили и * доказали это? По сравнению с 'System.out.println', атомная операция будет действительно очень дешевой. Это будет немного дороже, чем неатомная операция, но все же дешево. Если вы действительно, * действительно * однопоточные, то вы, вероятно, можете уйти с простой примитивной операцией, но вы должны прекрасно понимать, что в многопоточной среде это может привести к проблемам. –

+0

В принципе, вы правы. Я тестировал атомные операции в многопоточных приложениях с использованием CUDA и OpenCL. Операция атомарного приращения более дорога, чем простое приращение. Однако атомные операции приходят на помощь во многих ситуациях .... – gpuguy

0

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

С другой стороны, System.out.println должен будет обратиться в ОС. Используйте stdout. Преобразование символов и т. Д. На каждом из этих шагов потребуется много и много тактов.

Возвращаясь к исходному вопросу, если вы смотрите, сколько раз функция вызывается, вы можете попробовать запустить профайлер - есть различные настольные и андроидные решения. Таким образом, вам не нужно будет загрязнять ваш код с помощью подсчета/печати, и вы можете сохранить ваш производственный код более точным.

Снова подумав о дальнейшем дальнейшем, почему бы вам узнать точное количество раз, когда функция называется? Если вы беспокоитесь о дефекте, подумайте о написании некоторых модульных тестов, которые точно докажут, сколько раз вызывает вызов функции. Если вас беспокоит производительность, возможно, посмотрите на методы тестирования нагрузки в сочетании с вашим профилировщиком.

+0

Спасибо за ответ. Я согласен, что должен использовать Profiler. Но проблема в Android TarceView, никакая информация не приходит для собственного кода (который имеет мою функцию, которую я хочу подсчитать). – gpuguy

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