(только для Ipython) вы можете использовать % timeit для измерения среднего времени обработки:
def foo():
print "hello"
, а затем:
%timeit foo()
результатом является что-то вроде:
10000 loops, best of 3: 27 µs per loop
Никогда не делайте попытку "Большого взрыва". Почти всегда дует ветер в Вашей поверхности, так как это - рискованная, отчаянная мера, когда все остальное перестало работать.
Разделите и завоюйте: Это работает хорошо..., если Ваш мир имеет только две стороны. В реальном программном обеспечении необходимо завоевать столько передних сторон одновременно, можно редко позволять себе жить в черно-белой фантазии.
я предполагаю, что использовал что-то как "Дросселирование" для большей части моей карьеры: Постепенно превращающийся плохой старый код в новейший код. Вот мой рецепт:
Запускаются где-нибудь, это действительно не имеет значения где. Запишите несколько модульных тестов, чтобы видеть, как к коду действительно ведет себя. Узнайте, как часто это делает то, что Вы думаете, что это делает и как часто это не делает. Используйте свой IDE для рефакторинга кода, таким образом, можно протестировать его.
После первого дня, выскажите предположение, начали ли Вы в правильном месте демонтировать этого монстра. Если так, продолжите. В противном случае найдите новое место и запуститесь.
Преимущества этой стратегии: Это работает на маленьких шагах, таким образом, риск может контролироваться и если что-то повреждается, если должен быть в коде, Вы работали над прошлой неделей.
Недостаток: требуется много времени, и Вы будете чувствовать себя расстроенными, потому что часто, прогресс будет просто казаться настолько медленным, пока "узел" не появится и внезапно, все запускается, встают на свое место как будто волшебством.
Я никогда не слышал о термине 'Дроссель Приложения' - мне нравится он. Где возможно это всегда было бы хорошим подходом, он, конечно, минимизирует риск и довольно прагматичен, откалывая в большой части здания частью.
то, Где это не работает, по моему опыту, - то, где довольно существенные изменения необходимы сразу же - изменения, которые потребуют небольшого количества рефакторинга (или большое взламывание). В той ситуации я часто находил изменения, которые я должен был сделать, были правильными в основе большого комка грязи и не было никакой опции, но пачкающийся - даже, что должно было быть стандартным обслуживанием, или незначительные изменения улучшения были просто ужасны, и майор осуществляют рефакторинг, был наилучший вариант.
Для тех случаев, я пошел бы с делением и завоевал бы - первая цель, к которой я всегда стремлюсь, тестируемость, как только у Вас есть это все, остальное настолько легче. На самом деле это часто - один из основных драйверов, которые я имею для рефакторинга далеко от большого комка грязи †“такой код, часто очень почти непригодно для тестирования, надо надеяться, существует пример вводы и выводы UI, но иногда даже, который отсутствует.
Поэтому, когда сталкивающийся с кодом, где все смешано в UI, я обычно запускаю путем факторинга дискретных единиц функциональности в классы и методы, затем снижения тех частей кода на доменный или уровень служб. Выполнение его поразрядно значительно уменьшает шанс повреждения чего-то и облегчает точно определять, где повреждающийся код был, когда вещи действительно идут не так, как надо.
Выполнение безотносительно тестовых сценариев Вы имеете в наличии в конце каждого изменения и удостоверяетесь, что все еще встречаете своего рода базовую линию.
, Если Вы пишете хорошие модульные тесты, когда Вы идете, можно начать уменьшать масштаб проблемы, и я нашел, что это скоро становится практичным для проявления подхода дросселя - с достойными модульными тестами или по крайней мере правильной платформой для разрешения записи достойных модульных тестов, это становится намного более практичным для постепенной замены частей функциональности.
Если бы путем рефакторинга, Вы означаете улучшать код, не изменяя функциональность, я запустил бы путем создания автоматизированной основной линии регрессионного тестирования. Существует много инструментов там для помощи с этим. Я использую TestComlete, хотя существуют хорошие дешевые альтернативы.
устанавливавший базовую линию регрессионного теста, лично я тогда пошел бы с делением и завоевал бы, как он, по моему опыту, это наиболее вероятно успешно выполниться. Как только у Вас есть базовая линия тестирования, она имеет значение меньше, какой подход Вы выбираете.
Зависит от того, должно ли у Вас всегда быть рабочее состояние, так, чтобы Вы могли исправление ошибки и развертываться каждый раз, когда neccassary, затем Devide и Conquer был бы хорошим решением. Если можно поддержать старый код, при работе над новым (и иметь дисциплину для применения исправлений ошибок к обеим кодовым базам), перезапись может быть лучшим решением.
Действительно ли общая перезапись является опцией? По моему опыту, перезапись с нуля может часто быть более эффективной, чем попытка очистить существующую путаницу. Вы холод все еще сохраняете части существующего кода, но в новом контексте. И то же идет для gui и базы данных, если у Вас есть тот. Перепишите с нуля и возьмите с Вами, что можно использовать.
Запуск с чистой новой архитектуры и перемещение старых частей кода в эту новую часть архитектуры частью и рефакторингом его для удовлетворения новой дуге были бы хорошим вариантом. Я думаю, восходящий подход при перемещении функций был бы хорош.
Для меня это зависит от ситуации.
, Если бы это - очень маленький проект, я испытал бы желание просто переписать его с нуля... однако, у Вас не часто есть та роскошь.
Сбой, что, я пошел бы для того, чтобы отколоть в нем часть частью. Я записал бы модульные тесты, чтобы проверить существующую функциональность и медленно использовать TDD для преобразования кода в изящную и хорошо разработанную систему. В зависимости от того, сколько времени этот процесс собирается взять его, вероятно, начнет быть похожими на StranglerApplication, который Вы упомянули выше.
BigBang очень опасен, поскольку у Вас нет простого способа проверить, что обновленная система делает то же самое как старое.
Делят и Завоевывают, менее опасно, чем BigBang..., но если это - достаточно большая система, это может завершить то, чтобы быть столь же проблематичным как BigBang.