Увеличение / уменьшение по сравнению с назначением? - PullRequest
1 голос
/ 16 апреля 2009

Я записываю некоторую статистику в своем приложении. Одной из статистических данных является размер BigDataStructure. У меня есть два варианта:

  1. Создать счетчик и увеличить / уменьшать счетчик каждый раз есть добавить / удалить из BigDataStructure.

  2. Каждый раз, когда есть добавить / удалить от BigDataStructure, установите счетчик BigDataStructure.size ().

Есть ли хороший аргумент для того, чтобы сделать это так или иначе? Увеличивая / уменьшая счетчик, я избегаю вызова BigDataStructure.size (). Это также напрямую не связано с оператором присваивания (хотя, может быть, это происходит под капотом?)

Учитывая эти два варианта, какой из них предпочтительнее?

Ответы [ 9 ]

9 голосов
/ 16 апреля 2009

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

Кроме того, сегодня у вас есть только 1 место, которое добавляет записи, и 1 место, которое удаляет записи. Но, возможно, в будущем этого не произойдет.

4 голосов
/ 16 апреля 2009

Это зависит ...

Если BigDataStructure.size () требует работы для вычисления размера, я бы использовал счетчик. Это было бы более эффективно в этом случае.

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

3 голосов
/ 16 апреля 2009

Получите лучшее из обоих миров и сделайте их обоих. Вы можете найти что-то странное, если ваши цифры не согласны. Это хороший кандидат на утверждение.

1 голос
/ 16 апреля 2009

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

1 голос
/ 16 апреля 2009

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

1 голос
/ 16 апреля 2009

Я бы выбрал вариант 1.

AFAIK, x ++ и x + = 1 оба одинаковы с x = x + 1 во всех отношениях (кроме того, что вы вводите)

1 голос
/ 16 апреля 2009

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

0 голосов
/ 16 апреля 2009

Я бы использовал сначала, а потом assert(counter == BigDataStructure.size());

0 голосов
/ 16 апреля 2009

Если производительность имеет значение, это зависит от того, насколько дорогой вызов size (). Например, вызов size () для списка STL может быть O (n). И даже если вызов O (1), может быть быстрее увеличивать и уменьшать внешние счетчики. Вы, вероятно, должны сделать некоторые измерения производительности, чтобы выяснить, что является более эффективным. Если производительность не имеет значения, тогда перейдите к вызову size ().

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