2015-03-19 4 views
2

Мне интересно, есть ли какой-либо перфекционный тест для сырых объектов против указателей на объекты.Почему я должен использовать указатель (производительность)?

  • Я знаю, что нет смысла использовать указатели на ссылочных типах (например, карты), поэтому, пожалуйста, не упоминайте об этом.
  • Я знаю, что вы должны использовать указатели, если данные необходимо обновить, поэтому, пожалуйста, не упоминайте об этом.

Большинство ответов/документы, которые я нашел в основном перефразировать принципы из официальной документации: ... If the receiver is large, a big struct for instance, it will be much cheaper to use a pointer receiver.

Мой вопрос просто то, что означает «большой»/«большой»? Является указателем на строку overkill? как насчет структуры с двумя строками, как насчет строковых полей строки?

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

+5

Я много писал о том, когда использовать/не использовать указатели [над здесь] (http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values/23551970#23551970). Не потейте перфу, пока не узнаете, что работаете над кодом, который является вашим узким местом; знать, когда это поможет или причинит боль, вам действительно может потребоваться поэкспериментировать с вашим фактическим кодом, чтобы учитывать эффекты кеша и т. д. – twotwotwo

+0

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

+0

Я также обновил вопрос, чтобы уточнить, что речь идет не о том, когда использовать указатели. –

ответ

1

Цитирую официальный golang documentation

... рассмотрение эффективности. Если приемник большой, например, большая структура, гораздо дешевле использовать приемник указателя.

+0

Я читал, что мой вопрос - это то, что означает «большой». –

3

Пример, в котором он не имеет смысла использовать указатель для ссылочных типов (slices, maps, and channels)

Как уже упоминалось в this thread:

Понятие ссылки просто означает то, что служит для того, чтобы ссылаться на что-то. Это не волшебство.

Указатель - это простая ссылка, которая говорит вам, где искать.
Кусочек подскажет, с чего начать и как далеко.
Карты и каналы также просто говорят вам, где искать, но данные, которые они ссылаются, и операции, которые они поддерживают на этом, более сложны.

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

Как twotwotwo детали в «Pointers vs. values in parameters and return values», строки, значения интерфейса и значения функции также реализуются с помощью указателей.
Как следствие, вам редко понадобилось использовать указатель на эти объекты.

+4

Строки, значения интерфейса и значения функций также реализованы с помощью указателей. Там много чего [здесь] (http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values/23551970#23551970). – twotwotwo

+0

@twotwotwo Я пропустил ваш пост, это хороший. +1 – VonC

+0

Должен ли я понять из этого ответа, что для всего, что не является ссылочным типом, я должен использовать указатель? т.е. строки. –

0

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

  • Вы пишете чувствительный к задержке сервер, поэтому вы хотите минимизировать давление сбора мусора. Чтобы добиться того, чтобы ваша структура Request имела байтовое поле [8] вместо указателя на Data struct, в котором хранится байт [8]. Одно распределение вместо двух.

    • алгоритм вы пишете является более удобным для чтения, когда вы передаете-структуру и сделать копию

и т.д.

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