Асп. Волошин С. Б.*
Кафедра теории и автоматизации металлургических процессов и печей.
Северо-Кавказский горно-металлургический институт (государственный технологический университет)
Проведено сравнение традиционной технологии обработки массива данных с технологией LINQ. Представлены исходные коды примеров на языке программирования Microsoft Visual Basic 2008.
Введение
В мире существует целый ряд высококлассных специализированных программных пакетов для обработки данных, таких как MathCAD или STATISTICA, но они, как правило, являются дорогими коммерческими продуктами и использование их расчетных библиотек в программах сторонних разработчиков затруднено или невозможно. Как правило, в таких программах сложно автоматизировать ввод исходных данных, поступающих от измерительных приборов, подключенных к персональному компьютеру. В связи с этим многие ученые самостоятельно разрабатывают программы для обработки данных.
В настоящее время лидирующую позицию в мире средств разработки программного обеспечения занимает корпорация Microsoft со своей платформой .NET Framework и средой разработки Visual Studio. Платформа .NET Framework является средой исполнения для программ, написанных на различных языках программирования. Наиболее популярными языками программирования под .NET Framework являются C#, Visual Basic, C++, Delphi, Nemerle, Python и др.
Еще до недавнего времени программисты применяли такие же алгоритмы обработки данных, как и 20 лет назад. К примеру, для вычисления суммы положительных элементов вектора программисту, кодирующему на Visual Basic 2005, приходилось в цикле последовательно проверять все элементы массива и складывать отвечающие условию Элемент > 0. В итоге, если условия отбора данных были сложные, алгоритм представлял собой многоэтажную конструкцию, состоящую из операторов цикла For…Next или Do…Loop (зачастую вложенных) и операторов условного перехода IF…EndIF и Select…Case. При этом в особо сложных случаях для выхода из внутреннего цикла применяли оператор GoTo, что так же не упрощало понимание кода.
Ситуация изменилась с выходом в свет технологии интегрированных в язык запросов LINQ (Language Integrated Query) [1], появившейся в составе новой платформы корпорации Microsoft – .NET Framework 3.5 в конце 2007 г. (предварительная версия была доступна с конца 2006 г.). Язык запросов позволяет упросить процедуру выборки необходимых данных за счет использования структурированных запросов специального формата.
Забиваем Сайты В ТОП КУВАЛДОЙ - Уникальные возможности от SeoHammer
Каждая ссылка анализируется по трем пакетам оценки: SEO, Трафик и SMM.
SeoHammer делает продвижение сайта прозрачным и простым занятием.
Ссылки, вечные ссылки, статьи, упоминания, пресс-релизы - используйте по максимуму потенциал SeoHammer для продвижения вашего сайта.
Что умеет делать SeoHammer
— Продвижение в один клик, интеллектуальный подбор запросов, покупка самых лучших ссылок с высокой степенью качества у лучших бирж ссылок.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз,
а первые результаты появляются уже в течение первых 7 дней.
Зарегистрироваться и Начать продвижение
Запросы могут применяться к объектам, которые реализуют интерфейсы IEnumerable<(Of <(T) или IQueryable<(Of <(T>)>)[2]. Следовательно, проводить поиск можно в массивах (Array), коллекциях (Collection), словарях (Dictionary), списках (List) и т.д. Кроме того, LINQ позволяет обеспечивать взаимодействие с СУБД Microsoft SQL Server 2005 (LINQ to SQL), с объектом DataSet (LINQ to DataSet), с данными XML (LINQ to XML) и Entities (LINQ to Entities) [3].
Сравнение технологий
Для сравнения традиционного подхода и подхода с использованием технологии LINQ была написана тестовая программа. Автор сравнивал две технологии обработки данных, решая следующие задачи:
Выборка положительных элементов из исходного множества.
Выборка положительных элементов и ранжирование их по возрастанию.
Возведение в квадрат всех элементов исходного множества.
Отбор элементов исходного множества без повторов элементов с одинаковыми значениями.
Вычисление количества отрицательных элементов в исходном множестве.
Вычисление среднего значения элементов исходного множества.
Вычисление суммы элементов исходного множества.
Нахождение элемента исходного массива с максимальным значением.
Было проведено сравнение быстродействия обеих технологий для каждого алгоритма.
Перед рассмотрением непосредственно самих алгоритмов обратим внимание на ряд особенностей:
В качестве исходного множества использован один раз автоматически сгенерированный одномерный массив целочисленных элементов. Массив был сериализован в бинарный файл на жесткий диск и перед каждым тестом данные десериализовались в оперативную память. Количество элементов массива – .
Ни один из приведенных алгоритмов не изменяет массив исходных данных. Это особенно имеет значение, в случае, когда данные поступают и обрабатываются непрерывно, в режиме псевдореального времени. Там где это было необходимо, данные перемещали во временный типизированный список List(of Integer).
В примерах традиционных алгоритмов обработки данных специально используется цикл For…Next, так как он быстрее работает с массивами структурных типов данных (Integer, Double, Long), чем более удобный в использовании, но менее производительный цикл For…Each.
Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:
— Разгрузит мастера, специалиста или компанию;
— Позволит гибко управлять расписанием и загрузкой;
— Разошлет оповещения о новых услугах или акциях;
— Позволит принять оплату на карту/кошелек/счет;
— Позволит записываться на групповые и персональные посещения;
— Поможет получить от клиента отзывы о визите к вам;
— Включает в себя сервис чаевых.
Для новых пользователей первый месяц бесплатно.
Зарегистрироваться в сервисе
Исследования проводили на рабочей станции со следующей конфигурацией: процессор Intel Core2Duo E6550-2,3ГГц/4096 МБ ОЗУ/ОС MS Windows Vista Ultimate с отключенным “файлом подкачки”.
Все алгоритмы написаны в бесплатно распространяемой интегрированной среде разработки Microsoft Visual Basic 2008 Express, которую можно свободно скачать с официального сайта корпорации Microsoft.
Реализация алгоритмов
Выборка положительных элементов из исходного множества
Традиционный подход
Dim Result As New List(Of Integer)
For i As Integer = 0 To UBound(Vector)
If Vector(i) > 0 Then Result.Add(Vector(i))
Next
LINQ подход
Dim Query = From element In Vector Where element >= 0 _
Select element
Выборка положительных элементов и ранжирование их по возрастанию.
Традиционный подход
Dim Result As New List(Of Integer)
For i As Integer = 0 To UBound(Vector)
If Vector(i) > 0 Then Result.Add(Vector(i))
Next
Result.Sort()
LINQ подход
Dim Query = From element In Vector Where element >= 0 _
Select element Order By element
Возведение в квадрат всех элементов исходного множества
Традиционный подход
Dim Result As New List(Of Integer)
For i As Integer = 0 To UBound(Vector)
Result.Add(Vector(i) ^ 2)
Next
LINQ подход
Dim Query = From element In Vector _
Select element ^ 2
Отбор элементов исходного множества без повторов элементов с одинаковыми значениями
Традиционный подход
Dim Result As New List(Of Integer)
Dim isOutput As Boolean = True
For i As Integer = 0 To UBound(Vector)
isOutput = True
For j As Integer = 0 To i
If i <> j And Vector(i) = Vector(j) Then
isOutput = False
Exit For
End If
Next
If isOutput = True Then Result.Add(Vector(i))
Next
LINQ подход
Dim Query = From element In Vector _
Select element Distinct
Вычисление количества отрицательных элементов в исходном множестве
Традиционный подход
Dim count As Integer = 0
For i As Integer = 0 To UBound(Vector)
If Vector(i) < 0 Then count += 1
Next
LINQ подход
Dim Result As Integer = Aggregate Element In Vector _
Where Element < 0 Into Count()
Вычисление среднего значения элементов исходного множества
Традиционный подход
Dim sum As Integer = 0
Dim average As Double = 0
Dim count As Integer = UBound(Vector) + 1
For i As Integer = 0 To count - 1
sum += Vector(i)
Next
average = sum / count
LINQ подход
Dim Result As Double = Aggregate Element In Vector _
Into Average()
Вычисление суммы элементов исходного множества.
Традиционный подход
Dim sum As Integer = 0
For i As Integer = 0 To UBound(Vector)
sum += Vector(i)
Next
LINQ подход
Dim Result As Integer = Aggregate Element In Vector _
Into Sum()
Нахождение элемента исходного массива с максимальным значением.
Традиционный подход
Dim max As Integer = Vector(0)
For i As Integer = 1 To UBound(Vector)
If Vector(i) > max Then max = Vector(i)
Next
LINQ подход
Dim Result As Integer = Aggregate Element In Vector _
Into Max()
Результаты сравнения
| № |
Алгоритм |
LINQ, мс |
Традиционный, мс |
| 1 |
Выборка положительных элементов |
1205 |
1324 |
| 2 |
Сортировка по возрастанию |
62 |
6801 |
| 3 |
Возведение в квадрат |
13791 |
14820 |
| 4 |
Отбор элементов без повторов |
4330 |
209181 |
| 5 |
Количество отрицательных элементов |
2137 |
592 |
| 6 |
Среднее значение |
1139 |
201 |
| 7 |
Суммирование элементов |
920 |
172 |
| 8 |
Поиск максимума |
983 |
187 |
Выводы
Проведено сравнение традиционной технологии обработки массива данных с технологией LINQ.
Показано, что использование языка запросов LINQ значительно сокращает время разработки и объем написанного кода при проектировании алгоритмов для решения типичных задач обработки массива данных.
На некоторых типах рассмотренных задач (выборка положительных элементов, сортировка, возведение в квадрат, отбор элементов без повторов) производительность алгоритмов с LINQ технологией выше, чем у традиционных итерационных алгоритмов. На остальных рассмотренных типах задач (количество отрицательных элементов, вычисление среднего значения, суммирование элементов, поиск максимума) производительность алгоритмов с LINQ технологией хоть и ниже производительности итерационных алгоритмов, но является приемлемой для обработки достаточно больших объемов данных без существенных потерь скорости.
Рассматриваемая в данной статье технология LINQ успешно применялась автором для написания алгоритма обработки массива результатов тестирования более чем 6200 школьников 5 классов всех школ республики Северная Осетия-Алания в конце 2007 г.
Литература
Вагнер В. Исследуем LINQ // Алгоритм 2006. № 4.
Чистяков В. Коллекции в .NET Framework Class Library // RSDN Magazine 2003. № 6.
Paolo Pialorsi, Marco Russo. Introducing Microsoft LINQ. Microsoft Press. 2007.
*
Научный руководитель к.т.н., доц. Мамонтов Д. В.
|