KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework

Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Иво Салмре, "Программирование мобильных устройств на платформе .NET Compact Framework" бесплатно, без регистрации.
Перейти на страницу:

  'Создать атрибут изображения

  s_ImageAttribute = _

   New System.Drawing.Imaging.ImageAttributes

  s_ImageAttribute.SetColorKey(System.Drawing.Color.White, _

   System.Drawing.Color.White)

 End If


 'Возвратить его

 Return s_ImageAttribute

End Function


End Class

Листинг 8.2. Общий код, используемый во всех приведенных ниже вариантах тестов

'Желаемое число повторений теста

Const LOOP_SIZE As Integer = 8000

'---------------------------------------------------------

'Эта функция переустанавливает содержимое нашего тестового

'массива, что обеспечивает возможность многократного

'выполнения тестового алгоритма

'---------------------------------------------------------

Private Sub ResetTestArray(ByRef testArray() As String)

 If (testArray Is Nothing) Then

  ReDim testArray(6)

 End If

 testArray(0) = "big_blue_duck"

 testArray(1) = "small_yellow_horse"

 testArray(2) = "wide_blue_cow"

 testArray(3) = "tall_green_zepplin"

 testArray(4) = "short_blue_train"

 testArray(5) = "short_purple_dinosaur"

End Sub

Листинг 8.3. Тестовый пример, демонстрирующий неэкономное распределение памяти (типичный первоначальный вариант реализации интересующей нас функции)

Private Sub Button2_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles Button2.Click

 'Вызвать сборщик мусора, чтобы быть уверенными в том, что

 'тест начнется с чистого состояния.

 'ПРИБЕГАЙТЕ К ЭТОЙ МЕРЕ ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ! Вызовы

 'сборщика мусора в программах вручную будут приводить к снижению

 'общей производительности приложений!

 System.GC.Collect()

 Dim testArray() As String = Nothing


 '--------------------------------------------------

 'Просмотреть элементы массива и

 'найти те из них, в которых средним словом является

 '"blue". Заменить "blue" на "orange"

 'Запустить секундомер для нашего теста!

 '--------------------------------------------------

 PerformanceSampling.StartSample(0, "WastefulWorkerClass")

 Dim workerClass1 As WastefulWorkerClass

 Dim outerLoop As Integer

 For outerLoop = 1 To LOOP_SIZE

  'Присвоить элементам массива значения, которые мы хотим использовать

  'при тестировании

  ResetTestArray(testArray)


  Dim topIndex = testArray.Length - 1

  Dim idx As Integer

  For idx = 0 To topIndex

   '------------------------------------------

   'Создать экземпляр вспомогательного класса,

   'который расчленяет строку на три части

   'Это неэкономный способ!

   '------------------------------------------

   workerClass1 = New WastefulWorkerClass(testArray(idx))

   'Если средним словом является "blue", заменить его на "orange"

   If (workerClass1.MiddleSegment = "blue") Then

    'Заменить средний сегмент

    workerClass1.MiddleSegment = "orange"

    'Заменить слово

    testArray(idx) = workerClass1.getWholeString()

   End If

  Next 'внутренний цикл

 Next 'внешний цикл

 'Получить время окончания теста

 PerformanceSampling.StopSample(0)

 MsgBox(PerformanceSampling.GetSampleDurationText(0))

End Sub

Листинг 8.4. Рабочий класс для первого тестового примера

Option Strict On

Imports System


Public Class WastefulWorkerClass

Private m_beginning_segment As String

Public Property BeginSegment() As String

 Get

  Return m_beginning_segment

 End Get

 Set(ByVal Value As String)

  m_beginning_segment = Value

 End Set

End Property


Private m_middle_segment As String

Public Property MiddleSegment() As String

 Get

  Return m_middle_segment

 End Get

 Set(ByVal Value As String)

  m_middle_segment = Value

 End Set

End Property


Private m_end_segment As String

Public Property EndSegment() As String

 Get

  Return m_end_segment

 End Get

 Set(ByVal Value As String)

  m_end_segment = Value

 End Set

End Property


Public Sub New(ByVal in_word As String)

 Dim index_segment1 As Integer


 'Осуществляем поиск символов подчеркивания ("_") в строке

 index_segment1 = in_word.IndexOf("_", 0)


 'В случае отсутствия символов "_" все, что нам нужно, это первый сегмент

 If (index_segment1 = -1) Then

  m_beginning_segment = in_word

  m_middle_segment = ""

  m_end segment = ""

  Return

 Else

  'Если присутствует символ "_", отсечь его


  'Если первым символом является "_", то первым сегментом будет ""

  If (index_segment1 = 0) Then

   m_beginning_segment = ""

  Else

   'Первый сегмент

   m_beginning_segment = in_word.Substring(0, index_segment1)

  End If


  'Найти второй символ "_"

  Dim index_segment2 As Integer

  index_segment2 = in_word.IndexOf("_", index_segment1 + 1)


  'Второй символ "_" отсутствует

  If (index_segment2 = -1) Then

   m_middle_segment = ""

   m_end_segment = in_word.Substring(index_segment1 + 1)

   Return

  End If


  'Установить последний сегмент

  m_middle_segment = in_word.Substring(index_segment1 + 1, _

   index_segment2 - index_segment1 - 1)

  m_end_segment = in_word.Substring(index_segment2 + 1)

 End If

End Sub


'Возвращает все три сегмента, объединенные символами "_"

Public Function getWholeString() As String

 Return m_beginning_segment + "_" + m_middle_segment + "_" + _

  m_end_segment

End Function

End Class

Листинг 8.5. Тестовый пример, демонстрирующий уменьшение объема памяти, распределяемой для объектов (типичный образец улучшения первоначального варианта реализации интересующей нас функции)

Private Sub Button3_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles Button3.Click

 'Вызвать сборщик мусора, чтобы тест

 'начинался с чистого состояния.

 'ПРИБЕГАЙТЕ К ЭТОЙ МЕРЕ ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ! Вызовы

 'сборщика мусора в программах вручную будут приводить к снижению

 'общей производительности приложений!

 System.GC.Collect()


 Dim testArray() As String = Nothing


 '--------------------------------------------------

 'Просмотреть элементы массива и

 'найти те из них, в которых средним словом является

 '"blue". Заменить "blue" на "orange"

 'Запустить секундомер!

 '--------------------------------------------------

 PerformanceSampling.StartSample(1, "LessWasteful")


 '-------------------------------------------------------

 'БОЛЕЕ ЭКОНОМНЫЙ СПОСОБ: Распределить память для объекта

 'до вхождения в цикл

 '-------------------------------------------------------

 Dim workerClass1 As LessWastefulWorkerClass

 workerClass1 = New LessWastefulWorkerClass


 Dim outerLoop As Integer

 For outerLoop = 1 To LOOP_SIZE

  'Присвоить элементам массива значения, которые мы хотим использовать

  'при тестировании ResetTestArray(testArray)

  Dim topIndex As Integer = testArray.Length -1 Dim idx As Integer

  For idx = 0 To topIndex

   '---------------------------------------------------------

   'Теперь вместо повторного распределения памяти для объекта

   'нам достаточно лишь повторно воспользоваться им

   '---------------------------------------------------------

   'workerClass1 = new WastefulWorkerClass(

   ' testArray(topIndex))

   workerClass1.ReuseClass(testArray(idx))


   'Если средним словом является "blue", заменить его на "orange"

   If (workerClass1.MiddleSegment = "blue") Then

    'Заменить средний сегмент

    workerClass1.MiddleSegment = "orange"

    'Заменить слово

    testArray(idx) = workerClass1.getWholeString()

   End If

  Next ' внутренний цикл

 Next 'внешний цикл


 'Остановить секундомер!

 PerformanceSampling.StopSample(1)

 MsgBox(PerformanceSampling.GetSampleDurationText(1))

End Sub

Листинг 8.6. Рабочий класс для второго тестового примера

Option Strict

On Imports System


Public Class LessWastefulWorkerClass

Private m_beginning_segment As String

Public Property BeginSegment() As String

 Get

  Return m_beginning_segment

 End Get

 Set(ByVal Value As String)

  m_beginning_segment = Value

 End Set

End Property


Private m_middle_segment As String

Public Property MiddleSegment() As String

 Get

  Return m_middle_segment

 End Get

 Set(ByVal Value As String)

  m_middle_segment = Value

 End Set

End Property


Private m_end_segment As String

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*