Иммутабельные структуры данных - это производительность. Не производительность программы, а производительность программиста. Мы обсудим как иммутабельность помогает писать корректный многопоточный код быстрее. Рассмотрим другие смежные подходы, такие как readers-writer lock, actors и software transactional memory. Затем изучим широко распространенные структуры, такие как Rope, и попытаемся задизайнить многопоточное приложение на их основе. Под конец, мы погрузимся в System.Collections.Immutable и попытаемся понять, как реализовать иммутабельные коллекции эффективно.
2. Качество кода
1. Тесты всех видов, test coverage, property-based тесты
2. Preconditions for public methods, assertions for private
3. Compile-type checks: JetBrains Annotations ([NotNull],
[Pure]), roslyn analyzers
3. Чем мы займемся сегодня?
1. Поймём, где в вашем продукте иммутабельные
коллекции могут принести пользу и каким образом
2. Посмотрим на известные неизменяемые структуры
3. Изучим внутреннее устройство и потестируем
производительность реализаций в .NET
5. Mutable objects
class Point {
int X {get; set;}
int Y {get; set;}
Point(int x, int y) { X = x; Y = y; }
void IncreaseX(int xOffset) { X += xOffset; }
void IncreaseY(int yOffset) { Y += xOffset; }
}
6. Mutable objects
class Point {
int X {get; set;}
int Y {get; set;}
Point(int x, int y) { X = x; Y = y; }
void IncreaseX(int xOffset) { X += xOffset; }
void IncreaseY(int yOffset) { Y += xOffset; }
}
7. Shared state
class Point {
int X {get; set;}
int Y {get; set;}
Point(int x, int y) { … }
void IncreaseX(int xOffset) { … }
void IncreaseY(int yOffset) { … }
int GetHashCode() {…}
bool Equals(object other) {…}
}
Point
PolygonCircle
Contexts
Thread
Pool
8. Immutable
class Point { //could be struct
readonly int X;
readonly int Y;
Point(int x, int y) { X = x; Y = y; }
Point IncreaseX(int xOffset) => new Point(x + xOffset, y);
Point IncreaseY(int yOffset) => new Point(x, y + yOffset);
int GetHashCode() {…}
bool Equals(object other) {…}
}
18. Content model rwlock
start
calc
UI Thread Background threads
merge
write activity interrupts here
Should check CancellationToken
1. Write unresponsiveness
2. Lots of checks
3. Lots of Assert(Read/Write)
4. Bad intermediate state
44. Резюме
1. Теперь вы знаете почему выбор менее
производительной структуры данных может увеличить
производительность вашей команды
2. Теперь вы легко выберете самую подходящую
системную коллекцию и проверите её скорость
3. Теперь вы можете легко написать свою супер-
оптимальную иммутабельную коллекцию. Но это не
точно…
45. Что почитать?
• .NET Framework - Immutable Collections by Hadi Brais, March 2017
• Ropes: Theory and practice - IBM by Amin Ahmad, February 2008
• STM: https://groups.csail.mit.edu/tds/papers/Shavit/ShavitTouitou-podc95.pdf