Целью этого проекта является анализ данных о запасах компаний экологически чистой энергетики в 2017 и 2018 годах. Мы рассчитываем как сумму общих ежедневных объемов за каждый год, так и годовую доходность для каждого тикера.
В целом, эти акции экологически чистых энергетических компаний показали себя намного лучше в 2017 году, чем в 2018 году, за исключением TerraForm Power (тикер TERP), как вы можете видеть из данных ниже.
Рефакторинговые скрипты выполняли подпрограммы за 0,55 с и 0,57 с в 2017 и 2018 годах соответственно. Это незначительное улучшение по сравнению с 0,64 с и 0,67 с для исходного сценария, скриншоты представлены ниже.
Основное различие между двумя методами, используемыми для получения одних и тех же данных, заключается в методе хранения данных. В исходной подпрограмме ячейки на листе обновляются при каждой итерации цикла for, как показано в приведенном ниже коде.
For i in tickers
...
Worksheets("AllStocksAnalysis").Activate
Cells(4 + i, 1).Value = ticker
Cells(4 + i, 2).Value = totalVolume
Cells(4 + i, 3).Value = endingPrice / startingPrice - 1
...
End i
Сценарий для реорганизованного метода сохраняет выходные данные цикла в трех массивах данных, которые затем используются для обновления данных на листе после выполнения циклов сбора данных, как показано в приведенном ниже коде.
Dim tickerVolumes(12) As Long
Dim tickerStartingPrices(12) As Single
Dim tickerEndingPrices(12) As Single
...
'For loops populating arrays
...
For i = 0 To 11
Worksheets("All Stocks Analysis").Activate
Cells(4 + i, 1).Value = tickers(i)
Cells(4 + i, 2).Value = tickerVolumes(i)
Cells(4 + i, 3).Value = tickerEndingPrices(i) / tickerStartingPrices(i) - 1
End i
Эта манипуляция может показаться тривиальной, но она сократила время выполнения каждой подпрограммы примерно на десятую долю секунды.
Код рефакторинга может иметь преимущества или недостатки в зависимости от ситуации. В любом случае, если исходный код недостаточно прокомментирован или цель кода неизвестна, рефакторинг может быть очень трудным, поскольку у человека может не быть достаточных знаний о методах кодирования или цели. кода.
Если код недостаточно прокомментирован, может быть чрезвычайно сложно понять назначение каждого оператора и функции. Это затруднит рефакторинг кода.
Если цель кода неизвестна, трудно провести рефакторинг кода, не зная, какова конечная цель. Возьмем в качестве примера электродинамическое моделирование наночастиц металла-полупроводника с использованием обобщенной теории многочастиц Ми. Видите проблему? Независимо от того, насколько хорошо вы умеете переоснащать код, этот предмет требует глубоких знаний как электродинамики, так и сложных уравнений в частных производных.
Более того, рефакторинг кода может оказаться трудоемким процессом за небольшую отдачу. Возьмем в качестве примера наш анализ акций с помощью VBA. Если наборы данных, с которыми вы работаете, остаются того же порядка, которым мы манипулировали здесь, переоснащение кода так, чтобы он мог работать на 0,1 с быстрее, может быть не тем, что нас интересует. Однако, если бы мы анализировали более крупные сектора акций рынка или хедж-фонда, такое переоснащение может быть чрезвычайно ценным, когда выполнение кода начинает занимать тридцать минут или больше.
Рефакторинг кода также имеет много преимуществ. В целом рефакторинг кода часто делает его более элегантным, эффективным, а иногда и более понятным.
Если кто-то сможет манипулировать кодом так, что та же цель будет достигнута с меньшим количеством строк и более мощными функциями, код, как правило, будет легче понять и, вероятно, также будет выполняться быстрее.
Кроме того, рефакторинг кода дает более глубокое понимание того, для чего изначально предназначался код и как была достигнута конечная цель. При рефакторинге кода нужно еще раз взглянуть на сценарий и решить, что делает каждый оператор и можно ли и как сделать код более эффективным. Это увеличение знаний о коде, вероятно, будет означать, что комментарии к рефакторингу кода будут более полезными и наглядными во второй раз.
Самым очевидным преимуществом нашего рефакторизованного сценария VBA является время выполнения. Как говорилось ранее, обновленный сценарий работает примерно на десятую долю секунды быстрее, чем исходный сценарий.
Наш рефакторинговый сценарий также содержит гораздо более качественные комментарии, так что мы можем позже вернуться к коду и понять рефакторинговый сценарий гораздо лучше, чем мы могли бы понять исходный сценарий.
Кроме того, наш рефакторинговый сценарий содержит макрос, который делает все с помощью одной подпрограммы, тогда как исходный сценарий выполнял те же задачи с помощью нескольких подпрограмм.
Наконец, рефакторинговый сценарий легче модифицировать для выполнения аналогичных задач в других анализах. Данные хранятся в массивах самих макросов, а не заполняют ячейки на листах во время выполнения циклов. Если бы мы переоборудовали исходный сценарий для другой цели, нам пришлось бы практически полностью переписать циклы. Если бы мы переоборудовали рефакторинговый скрипт для другой цели, нам действительно нужно было бы только редактировать массивы и использовать функцию поиска и замены для обновления имен массивов в циклах.