Upload
dneprciklumevents
View
195
Download
2
Embed Size (px)
Citation preview
Кто здесь?
А главное зачем?
Повестка дня
1. О себе2. Цель доклада3. Поставленные вопросы4. Доклад по циклам5. Доклад по методам сериализации6. Выводы7. Вопросы
• Сухих Евгений Иванович• Проект IntraNote, продукт DocuNote• Workflow developer• Любитель поговорить и послушать
О себе
Tips to boost .NET Performance (Цели)
• Поделиться опытом
ВопросыВ нашем проекте довольно таки часто приходится иметь дело с массивами элементов (передача их с сервера на клиент и обратно, прохождение по массиву/коллекции). В связи с этим возникли вопросы выбора оптимального:
• Циклического оператора
• Механизма сериализации
• Много других вопросов…
I prefer number!!!
Единица измерения скорости
Я бы выбрал миллисекунды, но и их слишком много
В качестве временной шкалы выбраны тики
Только не спрашивайте что такое тики – я не знаю…
[Ctrl + c]
[Ctrl + v]
Приношу извинения за
Циклы - шмиклы
- for (int x = 1; x <= 5; x++) {… ;}
- while (y <= 5) {... y++;}
- do {... y++;} while (y <= 5)
- foreach (int i in array) {…}
- Рекурсия?
- Варианты?! …
for (int x = 1; x <= 5; x++) {… ;}
While /Do … while
FOREACH
var tmp = obj.GetEnumerator();int i;while(tmp.MoveNext()) { i = tmp.Current; {...} // your code}
Время работы с малыми массивами
Базовыми было решено использовать массивы небольшого размера.• 20 записей• 50 записей• 100 записейНу и для сравнения массивы побольше:• 10 000• 100 000
20 20 50 1000
5000100001500020000250003000035000400004500050000
DoForEachWhileFor
Примечательно
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
Первое обращение для всех циклов
существенно дольше последующих.
ПОЧЕМУ?
Ответы
• Я думаю что это из-за первой компиляции класса?!
• А что думаете Вы?
20 50 1000
100200300400500600700800900
1000
DoForEachWhileFor
Скорость перебора массива Integer на малых размерах
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
ПОЧЕМУ?
Что видно с гистограммы:
• ForEach и For циклы работают явно быстрее.
Возможно это связано с типом перебираемых данных.
Давайте возьмем другие типы данных.
20 50 1000
500
1000
1500
2000
2500
3000
3500
DoForEachWhileFor
String ()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
Выполняется в целом дольше. Почему?
20 50 1000
200
400
600
800
1000
1200
1400
1600
DoForEachWhileFor
Double ()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х Перебор 50-ти элементов длится дольше чем 100
Мистика !!!
20 50 1000
500
1000
1500
2000
2500
3000
DoForEachWhileFor
Date ()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
20 50 1000
500
1000
1500
2000
2500
3000
3500
4000
DoForEachWhileFor
CollectionItem ()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
20 50 1000
1000
2000
3000
4000
5000
6000
7000
DoForEachWhileFor
CollectionItem ()()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
Время в целом увеличилось
20 50 1000
1000
2000
3000
4000
5000
6000
7000
DoForEachWhileFor
CollectionItem ()() ()
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
«For» и «ForEach» быстрее чем «Do» и «While»
• Это не открытие Америки, это наглядный материал для тех, кто как и я, не любит читать!!!
Возникает два вопроса:• Почему «Do» и «While» медленные• «For» или «ForEach»
While
Влияют ли по разному записанные условия на результат• <, <=, • >, >=• =
Давайте попробуем
20 50 1000
100200300400500600700800900
1000
While >While =While <For
While c разными операторами
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
тика
х
ответ: НЕТ!!!
20 20 50 1000
50
100
150
200
250
ForForEach
Идеи?
«For» или «ForEach»на небольших массивах
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
1000 10000 1000000
2000
4000
6000
8000
10000
12000
14000
16000
18000
ForForEach
Где-то тут лидерство переходит к For
«For» или «ForEach»потеря лидерства
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
1000000 10000000 1000000000
2000000
4000000
6000000
8000000
10000000
12000000
14000000
16000000
18000000
ForForEach
«For» или «ForEach»на больших размерах
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
20 20 50100
100010000
100000
1000000
10000000
1000000000
1
2
3
4
5
6
7
8
ForForEach
Так это бы выглядело в миллисекундах
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Мил
лисе
кунд
ах
1000020000
3000040000
5000060000
7000080000
90000
1000000
2000
4000
6000
8000
10000
12000
14000
16000
ForForEach
Он близок
«For» или «ForEach»Кикбоксер 1
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
2000021000
2200023000
2400025000
2600027000
2800029000
300000
2000
4000
6000
8000
10000
12000
ForForEach
Еще немного
«For» или «ForEach»Матрица часть 2
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
2100021100
2120021300
2140021500
2160021700
2180021900
220000
500
1000
1500
2000
2500
3000
3500
ForForEach
«For» или «ForEach»Крепкий орешек 3
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
2120021210
2122021230
2124021250
2126021270
2128021290
213000
50010001500200025003000350040004500
ForForEach
«For» или «ForEach»Просто Мария
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
2124021241
2124221243
2124421245
2124621247
2124821249
212500
500
1000
1500
2000
2500
3000
3500
4000
ForForEach
«For» или «ForEach»Санта Барбара
Размер массива
Врем
я вы
полн
ения
опе
раци
и в
Тика
х
Вывод
• Для перебора элементов небольших массивов целесообразнее использовать ForEach
• Для просмотра больших массивов – For• Вышеприведенные данные верны только
для моей тестовой машины
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации — восстановление начального состояния структуры данных из битовой последовательности.
(с) Википедия
Определение
Критерии
• Размер данных• Время сериализации/десериализации• Читабельность• Совместимость версий
Что пишут другие
Разные сериализаторы
• SoapFormatter• BinaryFormatter• XmlSerializer• DataContractSerializer• NetDataContractSerializer• LosFormatter• JsonDataContractSerializer
SoapFormatter
• Beginning with the .NET Framework version 3.5, this class is obsolete. Use BinaryFormatter instead.
Used for Net Remoting
BinaryFormatter
NetDataContractSerializer
DataContractSerializer
NetDataContractSerializer
LosFormatter
DataContractJsonSerializer
Скорость
1 1 10 100 10000
2000
4000
6000
8000
10000
12000
14000
16000
Binary to fileBinary to memoryDataContaractNetDataContractXmlLosFormatterDataContractJson
И опять, на удивление, первое обращение заметно дольше чем последующие.
Особенно явно это выражено у XmlSerializer-а
Скорость в тиках
1 10 100 10000
100
200
300
400
500
600
700
Binary to fileBinary to memoryDataContaractNetDataContractXmlLosFormatterDataContractJson
Количество элементов в листе
Греб
анны
е ти
ки
Скорость в миллисекундах
1 1 10 100 1000 10000 1000000123456789
10
Binary to fileBinary to memoryDataContaractNetDataContractXmlLosFormatterDataContractJson
Количество элементов в листе
Мил
лисе
кунд
ы
Размер в килобайтах
1 10 100 10000
10
20
30
40
50
60
70
80
Binary to fileBinary to memoryDataContaractNetDataContractXmlLosFormatterDataContractJson
Количество элементов в листе
Кб
Размер в килобайтах
1000 10000 1000000
1000
2000
3000
4000
5000
6000
7000
8000
Binary to fileBinary to memoryDataContaractNetDataContractXmlLosFormatterDataContractJson
Количество элементов в листе
Кб Но что же происходит с увеличением количества элементов в массиве?
НИЧЕГО!
LosFormatter выигрывает и по скорости и по времени
Вот такой вид имеют сериализованные данные: /wEyigQAAQAAAP////8BAAAAAAAAAAwCAAAAQVRlc3QgbG9vcHMsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAYdGVzdF9sb29wcy5DMS5Db2xsZWN0aW9uBQAAAAxfRGVzY3JpcHRpb24GT3ZlcmxvDUxpc3RgMStfaXRlbXMMTGlzdGAxK19zaXplD0xpc3RgMStfdmVyc2lvbgECBAAAHnRlc3RfbG9vcHMuQzEuQ29sbGVjdGlvbkl0ZW1bXQIAAAAICAIAAAAKCgkDAAAAAgAAAAIAAAAHAwAAAAABAAAABAAAAAQcdGVzdF9sb29wcy5DMS5Db2xsZWN0aW9uSXRlbQIAAAAJBAAAAAkFAAAADQIFBAAAABx0ZXN0X2xvb3BzLkMxLkNvbGxlY3Rpb25JdGVtBQAAAA1fSW50ZWdlclZhbHVlDF9TdHJpbmdWYWx1ZQ5fRGF0ZVRpbWVWYWx1ZQ1fQm9vbGVhblZhbHVlDF9Eb3VibGVWYWx1ZQABAAAACA0BBgIAAAAoalpVBgYAAAAQMCwxNTkxODcxMTg1OTY5Nag1HJdvMc6IAQAAAAAAAFBAAQUAAAAEAAAAKGpaVQYHAAAAEDAsMTU5MTg3MTE4NTk2OTWoNRyXbzHOiAEAAAAAAABQQAs=
Я ничего не понял что тут засериализовано, а ВЫ?
Что мы выбрали
NetDataCintractSerializer
Sources
• Learn C# Programming Tutorial Lesson 4 – Loops
• How do foreach loops work in C#?• Сериализация в .NET. Выпрямляем своими
руками• BinaryFormatter alternatives• BinaryFormatter Class• Binary & XML• http://stackoverflow.com/questions/365615/
in-net-which-loop-runs-faster-for-or-foreach
Чего собственно я хочу от Вас!!!
• Наступать на грабли приятно, но не выгодно – давайте создадим карту граблей
• Если грабли хаотически прыгают по этой карте – давайте научимся их отлавливать в конкретный момент времени
• Давайте грабли поставим в сарай!!!
А что дальше
Давайте встречаться и обсуждать: - практические аспекты- теоретические подходы - методики из реальной жизни- алгоритмы в рутинной деятельности- да все что угодно – ЭТО НАС РАЗВИВАЕТ
Класс и структура
• Давай обсудим?!
Спасибо
• Спасибо что пришли• Спасибо Анне Тупиковой за настойчивость• Спасибо Татьяне Аксеновой за научную
критику• Спасибо Александру Сухому за полезные
советы• Спасибо всему коллективу за потраченное
время• Окрема подяка за підтримку МегаМозку
ВСЕ!