Действительно ли безопасно обычно предположить, что toString () имеет низкую стоимость?

Я понял это. Когда-либо у изображения было другое выходное разрешение от некоторой причины (я не знаю почему). Таким образом, видя ширину и высоту изображения, я мог узнать x, y, w и h слева, сверху, справа и снизу и мог обрезать нужный объект.

14
задан jjnguy 17 September 2008 в 22:02
поделиться

17 ответов

Библиотека стандарта Java, кажется, была записана с намерением хранения стоимости вызовов toString очень низко. Например, массивы Java и наборы имеют toString методы, которые не выполняют итерации по их содержанию; для получения хорошего строкового представления этих объектов, необходимо использовать или Arrays.toString или Collections.toString от java.util пакет.

точно так же даже объекты с дорогим равняются методам, имеют недорогие вызовы toString. Например, java.net.URL класс имеет, равняется методу, который использует интернет-соединение, чтобы определить, действительно ли два URL равны, но это все еще имеет простой и постоянно-разовый toString метод.

Так да, недорогие вызовы toString являются нормой, и если Вы не используете некоторый странный сторонний пакет, который порывает с конвенцией, Вы не должны волновать по поводу них занимание много времени.

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

19
ответ дан 1 December 2019 в 05:50
поделиться

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

1
ответ дан 1 December 2019 в 05:50
поделиться

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

3
ответ дан 1 December 2019 в 05:50
поделиться

Вы обычно предполагаете, что toString () на каком-либо данном объекте имеет низкую стоимость? Я делаю.

, Почему Вы сделали бы это? Профиль Ваш код, если Вы сталкиваетесь с проблемами производительности; это сохранит Вас много времени, работая прошлые неправильные предположения.

5
ответ дан 1 December 2019 в 05:50
поделиться

Нет это не. Поскольку ToString () может быть перегружен любым, они могут сделать то, что они любят. Это - разумное предположение, что ToString () ДОЛЖЕН иметь низкую стоимость, но если ToString () свойства доступов, которые делают "ленивую загрузку" данных, Вы могли бы даже поразить базу данных в своем ToString ().

38
ответ дан 1 December 2019 в 05:50
поделиться

Мой прагматический ответ был бы: да, Вы всегда принимаете toString (), вызов является дешевым, если Вы не делаете огромную сумму из них. С одной стороны, крайне маловероятно, что toString () метод был бы дорогим и с другой стороны, крайне маловероятно, что Вы сталкиваетесь с проблемой, если это не. Я обычно не волнуюсь о проблемах как они, потому что существуют слишком многие из них, и Вы не получите кода, записанного, если Вы сделаете ;).

при столкновении с проблемами производительности, все открыто, включая производительность toString () и Вы должны, как Shog9 предполагают, просто представляют код. Трудные вопросы Java шоу, что даже Sun записал некоторым довольно противным конструкторам и toString () методы в их JDK.

1
ответ дан 1 December 2019 в 05:50
поделиться

Лучший способ узнать состоит в том, чтобы представить Ваш код. Однако, а не беспокойство, что конкретная функция имеет высокие издержки, (обычно) лучше волноваться о правильности Вашего приложения и затем сделать профилирование производительности на нем (но быть осторожными, что реальное использование и Ваша тестовая установка могут отличаться радикально). Как оказалось, программисты обычно не угадывают о том, что является действительно медленным в их приложении, и они часто тратят много вещей оптимизации времени, которые не нуждаются в оптимизации (устраняющий тот тройной вложенный цикл, который только использует.01% времени Вашего приложения, вероятно, отходы).

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

9
ответ дан 1 December 2019 в 05:50
поделиться

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

, Например, в Java, StringBuilder предварительно выделит некоторое пространство так, чтобы определенное количество строкового добавления заняло время. Это перераспределит, когда у Вас закончится пространство.

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

0
ответ дан 1 December 2019 в 05:50
поделиться

В целом я не проверяю каждую реализацию. Однако, если я вижу зависимость от свободного городского населения Apache, сигналы тревоги уходят, и я смотрю на реализацию более тесно, чтобы удостовериться, что они не используют ToStringBuilder или другие злодеяния.

0
ответ дан 1 December 2019 в 05:50
поделиться

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

обычно существует несколько причин, почему Вы используете toString (): вход/отладка, вероятно, наиболее характерен для случайных объектов; дисплей характерен для определенных объектов (таких как числа). Для входа я сделал бы что-то как

if(logger.isDebugEnabled()) {
    logger.debug("The zig didn't take off.  Response: {0}", response.getAsXML().toString());
}

, Это делает две вещи: 1. Предотвращает построение строки и 2. Предотвращает ненужное строковое дополнение, если сообщение не будет зарегистрировано.

0
ответ дан 1 December 2019 в 05:50
поделиться

Так как Вы помещаете "обычно" в свой вопрос, я сказал бы да. Для - большинство объектов, там не будет дорогостоящей перегрузкой ToString. Определенно может быть, но обычно не будет.

0
ответ дан 1 December 2019 в 05:50
поделиться

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

, Таким образом, мое правило является toString () на простых объектах, обычно безопасно, но на сложных объектах подозреваемый, пока не проверено.

0
ответ дан 1 December 2019 в 05:50
поделиться

Существует легкий ответ этому, которого я сначала слышал в дискуссии об отражении: "если необходимо спросить, Вы не можете позволить себе его".

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

ToString () для сообщений журнала автоматически хорошо, потому что вход является уже дорогим. Если Ваша программа является слишком медленной, выключите уровень журнала! Действительно не имеет значения, как медленный это должно на самом деле генерировать сообщения отладки, пока можно принять решение не генерировать их. (Отметьте: Ваша инфраструктура входа должна назвать ToString () сам, и только когда сообщение журнала, как предполагается, печатается. Не делайте ToString () это вручную на пути в инфраструктура журнала, или Вы заплатите цену, даже если уровень журнала будет низким, и Вы не будете печатать его, в конце концов! См. http://www.colijn.ca/~caffeine/?m=200708#16 для большего количества объяснения этого.)

0
ответ дан 1 December 2019 в 05:50
поделиться

Я буду всегда переопределять toString, чтобы вставить независимо от того, что я думаю, что должен буду отладить проблемы. Это это обычно до разработчика для использования его или вызовом самого toString метода или наличием другого класса называет его для Вас (println, вход, и т.д.).

0
ответ дан 1 December 2019 в 05:50
поделиться

Моя мысль:

Да на стандартных объектах библиотеки

No на нестандартных объектах, если Вы не имеете исходный код перед Вами и можете проверить его.

0
ответ дан 1 December 2019 в 05:50
поделиться

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

1
ответ дан 1 December 2019 в 05:50
поделиться

toString () используется для представления объекта как Строки. Таким образом, если Вы должны замедлить под управлением код для создания представления объекта, необходимо быть очень осторожны и иметь очень серьезное основание сделать так. Отладка была бы единственной, о которой я могу думать, где медленное выполнение toString приемлемо.

0
ответ дан 1 December 2019 в 05:50
поделиться