Вы можете установить переменную среды с помощью параметра шаблона:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Parameters:
Stage:
Type: String
AllowedValues:
- dev
- prod
Globals:
Function:
Environment:
Variables:
STAGE: !Ref Stage
Затем в процессе развертывания передайте параметр Stage
при создании / обновлении стека из шаблона SAM. Например, если вы делаете это через CLI , используйте --parameters ParameterKey=Stage,ParameterValue=prod
.
Технически производительность дженериков, как Вы говорите, лучше. Однако, если производительность не чрезвычайно важна, И Вы уже оптимизировали в других областях, Вы, вероятно, получите НАМНОГО лучшие улучшения путем проведения времени в другом месте.
я предложил бы:
, Конечно, существуют причины кроме производительности для изменения на дженерики:
Дженерики имеют намного лучшую производительность особенно при использовании типа значения (интервал, bool, структура и т.д.), где Вы получите значимое увеличение производительности.
Используя Arraylist с упаковкой/распаковыванием причин типов значения, которая, если сделано несколько сотен раз существенно медленнее затем использует универсальный Список.
при хранении типов значения как объекта Вы будете в до четырех раз память на объект. В то время как эта сумма не истощит Вашу RAM кэш-память, которая меньшего размера, мог содержать меньше объектов, Что означает, что при итерации длинные наборы там были бы многими копиями от оперативной памяти до кэша, который замедлит приложение.
я записал приблизительно здесь .
Используя дженерики должен также означать, что Ваш код будет simplier и простой в использовании, если Вы захотите усилить вещи как linq в позже c# версии.
Вот результаты, я получил от простого парсинга строки из файла 100,000 100 КБ времена. Универсальный Список (Символа) занял 612,293 секунд для движения 100,000 раз через файл. ArrayList занял 2 880.415 секунды для движения 100,000 раз через файл. Это означает в этом сценарии (поскольку Ваш пробег будет варьироваться), Универсальный Список (Символа) в 4.7 раза быстрее.
Вот код, который я пробежал 100,000 раз:
Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
Dim genList As New ArrayList
For Each ch As Char In strToProcess.ToCharArray
genList.Add(ch)
Next
Dim dummy As New System.Text.StringBuilder()
For i As Integer = 0 To genList.Count - 1
dummy.Append(genList(i))
Next
End Sub
Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
Dim genList As New List(Of Char)
For Each ch As Char In strToProcess.ToCharArray
genList.Add(ch)
Next
Dim dummy As New System.Text.StringBuilder()
For i As Integer = 0 To genList.Count - 1
dummy.Append(genList(i))
Next
End Sub
Единственный способ знать наверняка состоит в том, чтобы представить Ваш код с помощью инструмента как dotTrace.
http://www.jetbrains.com/profiler/
возможно, что упаковку/распаковывание тривиальна в Вашем конкретном приложении и не стоило бы осуществлять рефакторинг. Продвижение, необходимо все еще рассмотреть использование дженериков из-за безопасности типов времени компиляции.
Дженерики, или Java или.NET, должны использоваться для дизайна и безопасности типов, не для производительности. Автоупаковка отличается от дженериков (чрезвычайно неявный объект к примитивным преобразованиям), и как Вы упомянули, Вы не должны использовать их вместо примитива, если должно быть много арифметики или других операций, которые вызовут хит производительности из повторного неявного создания объекта / разрушение.
Полный я предложил бы использовать продвижение и только обновление существующего кода, если это должно быть очищено для безопасности типов / цели дизайна, не производительность.
Моя старая компания на самом деле рассмотрела эту проблему. Подход, который мы проявили, был: если легко осуществить рефакторинг, сделайте это; если не (т.е. это коснется слишком многих классов), оставьте его в течение более позднего времени. Это действительно зависит от того, есть ли у Вас время, чтобы сделать это, или существуют ли более важные объекты для кодирования (т.е. опции, которые необходимо реализовать для клиентов).
С другой стороны, если Вы не работаете над чем-то для клиента, разрешения и проводите время, осуществляя рефакторинг. Это улучшит удобочитаемость кода для себя.
Что автоупаковка/распаковывание имеет отношение к дженерикам? Это - просто проблема безопасности типов. С неуниверсальным набором Вы обязаны явно вспоминать фактический тип объекта. С дженериками можно пропустить этот шаг. Я не думаю, что так или иначе существует различие в производительности.
Это зависит, лучший ответ должен представить Ваш код и видеть. Мне нравится AQTime, но много пакетов существуют для этого.
В целом, если ArrayList используется МНОГО, может стоить переключить его на универсальную версию. Действительно, хотя, наиболее вероятно, что Вы даже не смогли бы измерить различие в производительности. Упаковка и распаковывание являются дополнительными шагами, но современные компьютеры так быстры, что это не имеет почти значения. Поскольку ArrayList является действительно просто нормальным массивом с хорошей оберткой, Вы, вероятно, видели бы намного больше производительности, полученной от лучшего выбора структуры данных (ArrayList. Удалите O (n)!), чем с преобразованием в дженерики.
Редактирование: у Программиста Преступника есть положительная сторона, Вы будете все еще упаковывать и распаковывать с дженериками, это просто происходит неявно. Весь код вокруг проверки исключения и аннулирует от кастинга и "/поскольку", ключевые слова помогли бы немного все же.
Зависит от того, сколько находится там в Вашем коде. Если бы Вы, привязка или отображает большие списки в UI, Вы, вероятно, видели бы большое усиление в производительности.
, Если бы Ваши ArrayList просто опрыснуты о тут и там, то это, вероятно, не было бы грандиозное предприятие просто очистить его, но также и не повлияет на общую производительность очень.
при использовании много ArrayLists всюду по коду и это был бы большой untertaking для замены их (что-то, что может повлиять расписания), затем Вы могли принять подход if-you-touch-it-change-it.
Главное состоит, тем не менее, в том, что Дженерики намного легче считать и более стабильны через приложение из-за строгого контроля типов, который Вы получаете от них. Вы будете видеть усиления не только от производительности, но и от пригодности для обслуживания кода и устойчивости. Если бы можно сделать это быстро, я сказал бы, делают это.
, Если бы можно получить закрытие сделки от Владельца продукта, я рекомендовал бы получить очищенный. Вы любите свой код больше позже.
Если объектами в ArrayLists будут Типы объектов, то Вы получите немного от не кастинга их к корректному типу. Если они - типы Значения (структуры или примитивы как Int32), то процесс упаковки/распаковывания добавляет много издержек, и Универсальные наборы должны быть намного быстрее.
Самые большие усиления, Вы найдете в Этапы технического обслуживания. Дженерики намного легче иметь дело с и обновление, не имея необходимость иметь дело с преобразованием и бросая проблемы. Если это - код, который Вы постоянно посещаете, то любой ценой прилагают усилия. Если это будет кодом, который не был затронут в течение многих лет, то я действительно не обеспокоюсь.