Это хорошая практика, чтобы избежать постоянного создания объекта? - PullRequest
2 голосов
/ 12 марта 2011

Доброе утро,

Скажем, у меня есть класс ClassA, оператор +, который суммирует два объекта типа ClassA, неявное приведение от int до ClassA ичто я хочу перегрузить оператор ++ ... Предположим, код для + довольно длинный, но что сумма ClassA и 1 является очень частным случаем, какой вариант лучше?

  1. Реализация ++ с использованием + и уже определенное неявное приведение.
  2. Повторение части кода, которая значительно упрощает добавление только 1.

Моя идея заключается в том, что (2) лучше, поскольку он сохраняет создание нового объекта ClassA путем неявного приведения, что может быть весьма полезным, если оператор ++ используется, например, в for цикл.Кроме того, скорость является обязательным.

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 12 марта 2011

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

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

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

3 голосов
/ 12 марта 2011

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

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

0 голосов
/ 12 марта 2011

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

Иначе об этой специальной оптимизации будет слишком легко забыть 6 мес. вниз по дороге, когда вы пытаетесь оптимизировать.

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

...