Дженерики по сравнению со списками массива

Вы можете установить переменную среды с помощью параметра шаблона:


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.

15
задан David Thibault 18 September 2008 в 17:50
поделиться

12 ответов

Технически производительность дженериков, как Вы говорите, лучше. Однако, если производительность не чрезвычайно важна, И Вы уже оптимизировали в других областях, Вы, вероятно, получите НАМНОГО лучшие улучшения путем проведения времени в другом месте.

я предложил бы:

  • продвижение дженериков использования.
  • , если у Вас есть твердые модульные тесты затем, осуществляют рефакторинг к дженерикам, как Вы касаетесь, код
  • тратят другие рефакторинги/измерение выполнения времени, которые значительно улучшат производительность (вызовы базы данных, изменяя структуры данных, и т.д.), а не несколько миллисекунд тут и там.

, Конечно, существуют причины кроме производительности для изменения на дженерики:

  • менее подверженный ошибкам, так как у Вас есть время компиляции, проверяя типов
  • более читаемый, Вы не должны бросать повсеместно, и очевидно, какой тип хранится в наборе
  • при использовании продвижения дженериков затем это более чисто для использования их везде
14
ответ дан 1 December 2019 в 02:10
поделиться

Дженерики имеют намного лучшую производительность особенно при использовании типа значения (интервал, bool, структура и т.д.), где Вы получите значимое увеличение производительности.

  1. Используя Arraylist с упаковкой/распаковыванием причин типов значения, которая, если сделано несколько сотен раз существенно медленнее затем использует универсальный Список.

  2. при хранении типов значения как объекта Вы будете в до четырех раз память на объект. В то время как эта сумма не истощит Вашу RAM кэш-память, которая меньшего размера, мог содержать меньше объектов, Что означает, что при итерации длинные наборы там были бы многими копиями от оперативной памяти до кэша, который замедлит приложение.

я записал приблизительно здесь .

0
ответ дан 1 December 2019 в 02:10
поделиться

Используя дженерики должен также означать, что Ваш код будет simplier и простой в использовании, если Вы захотите усилить вещи как linq в позже c# версии.

0
ответ дан 1 December 2019 в 02:10
поделиться

Вот результаты, я получил от простого парсинга строки из файла 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
8
ответ дан 1 December 2019 в 02:10
поделиться

Единственный способ знать наверняка состоит в том, чтобы представить Ваш код с помощью инструмента как dotTrace.

http://www.jetbrains.com/profiler/

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

4
ответ дан 1 December 2019 в 02:10
поделиться

Дженерики, или Java или.NET, должны использоваться для дизайна и безопасности типов, не для производительности. Автоупаковка отличается от дженериков (чрезвычайно неявный объект к примитивным преобразованиям), и как Вы упомянули, Вы не должны использовать их вместо примитива, если должно быть много арифметики или других операций, которые вызовут хит производительности из повторного неявного создания объекта / разрушение.

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

3
ответ дан 1 December 2019 в 02:10
поделиться

Моя старая компания на самом деле рассмотрела эту проблему. Подход, который мы проявили, был: если легко осуществить рефакторинг, сделайте это; если не (т.е. это коснется слишком многих классов), оставьте его в течение более позднего времени. Это действительно зависит от того, есть ли у Вас время, чтобы сделать это, или существуют ли более важные объекты для кодирования (т.е. опции, которые необходимо реализовать для клиентов).

С другой стороны, если Вы не работаете над чем-то для клиента, разрешения и проводите время, осуществляя рефакторинг. Это улучшит удобочитаемость кода для себя.

0
ответ дан 1 December 2019 в 02:10
поделиться

Что автоупаковка/распаковывание имеет отношение к дженерикам? Это - просто проблема безопасности типов. С неуниверсальным набором Вы обязаны явно вспоминать фактический тип объекта. С дженериками можно пропустить этот шаг. Я не думаю, что так или иначе существует различие в производительности.

0
ответ дан 1 December 2019 в 02:10
поделиться

Это зависит, лучший ответ должен представить Ваш код и видеть. Мне нравится AQTime, но много пакетов существуют для этого.

В целом, если ArrayList используется МНОГО, может стоить переключить его на универсальную версию. Действительно, хотя, наиболее вероятно, что Вы даже не смогли бы измерить различие в производительности. Упаковка и распаковывание являются дополнительными шагами, но современные компьютеры так быстры, что это не имеет почти значения. Поскольку ArrayList является действительно просто нормальным массивом с хорошей оберткой, Вы, вероятно, видели бы намного больше производительности, полученной от лучшего выбора структуры данных (ArrayList. Удалите O (n)!), чем с преобразованием в дженерики.

Редактирование: у Программиста Преступника есть положительная сторона, Вы будете все еще упаковывать и распаковывать с дженериками, это просто происходит неявно. Весь код вокруг проверки исключения и аннулирует от кастинга и "/поскольку", ключевые слова помогли бы немного все же.

1
ответ дан 1 December 2019 в 02:10
поделиться

Зависит от того, сколько находится там в Вашем коде. Если бы Вы, привязка или отображает большие списки в UI, Вы, вероятно, видели бы большое усиление в производительности.

, Если бы Ваши ArrayList просто опрыснуты о тут и там, то это, вероятно, не было бы грандиозное предприятие просто очистить его, но также и не повлияет на общую производительность очень.

при использовании много ArrayLists всюду по коду и это был бы большой untertaking для замены их (что-то, что может повлиять расписания), затем Вы могли принять подход if-you-touch-it-change-it.

Главное состоит, тем не менее, в том, что Дженерики намного легче считать и более стабильны через приложение из-за строгого контроля типов, который Вы получаете от них. Вы будете видеть усиления не только от производительности, но и от пригодности для обслуживания кода и устойчивости. Если бы можно сделать это быстро, я сказал бы, делают это.

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

0
ответ дан 1 December 2019 в 02:10
поделиться

Если объектами в ArrayLists будут Типы объектов, то Вы получите немного от не кастинга их к корректному типу. Если они - типы Значения (структуры или примитивы как Int32), то процесс упаковки/распаковывания добавляет много издержек, и Универсальные наборы должны быть намного быстрее.

Вот статья MSDN о предмете

0
ответ дан 1 December 2019 в 02:10
поделиться

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

0
ответ дан 1 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: