Value Type vs. Reference Type (.NET)

а также про Stack, Heap и Boxing

Прежде всего, разница обусловлена тем, что экземпляры (instances) по-разному хранят ассоциированные с ними данные:

Value Type Reference Type
Что внутри? Сами данные Ссылка на данные
Что копируется / передаётся? Сами данные Ссылка на данные
Время жизни Каждый экземпляр автономен Пока есть хотя бы одна ссылка
Сравнение (по умолчанию) Структурное¹ Равны, если обе ссылки ведут в одно и то же место

¹ В лучшем случае — побитовое, в худшем — по полям через Reflection (подробности).

Во вторую очередь:

  • Экземпляры value-типов часто живут на стеке (stack).
  • Экземпляры reference-типов почти всегда ссылаются на данные, аллоцированные в управляемой куче (managed heap).

Почему во вторую очередь? Потому что само наличие стека — это деталь реализации. С другой стороны, JIT/AOT-компилятор может так оптимизировать итоговый код, что экземпляр value-типа не покинет регистров процессора.

Читать далее ▸


Шпаргалка по многопоточности в .NET (System.Threading)

Parallel vs. Concurrent

  • Parallelism (параллелизм) — более узкий термин, подчёркивающий наличие нескольких вычислительных устройств (машин, процессоров, ядер).

  • Concurrency (одновременность) может быть реализована через разбиение на части и быстрое переключение между ними, что создаёт иллюзию параллелизма.

Но это занудство. Термины используют как синонимы даже в специализированных источниках.

Preemptive vs. Cooperative

  • Preemptive (вытесняющее) — способ переключения контекста на уровне операционной системы, когда процессы и потоки хотели бы занимать всё процессорное время, но планировщик принудительно их приостанавливает, чтобы дать поработать другим.

  • Cooperative (кооперативное) — способ переключения на уровне runtime или пользовательского кода, когда предусмотрены явные и/или неявные сигналы о готовности добровольно встать на паузу. Неявные сигналы — это например, остановка в ожидании I/O (сеть, диск, основная память). Явные сигналы даются командой yield (уступить). Модули, взаимодействующие таким образом, называются сопрограммами (coroutine).

Читать далее ▸


Что такое .NET?

Тезисное, но ёмкое определение, актуальное на сегодняшний день.

Если нужно выделить одно самое главное слово, то .NET — это платформа либо экосистема. Платформа для создания ништяков — a platform for building stuff — как выразился Хансельман.

Старые версии (до 5.0) исторически называются .NET Framework

  • Done but not dead — не будет развиваться, но поддержка продолжается
  • Windows only
  • Proprietary software
  • Установлен глобально в систему
  • Web Forms остались здесь (и это хорошо)

Актуальные версии (начиная с 5.0) называются просто .NET

  • Cross platform: Linux, Mac, мобильные
  • Open source, GitHub, MIT License
  • Можно установить много версий на одну машину
  • Чётные версии — LTS, long-term support
  • Всё развитие здесь: новые фишки C#, обновления стандартных API, новые типы приложений (workloads), новые способы компиляции…

Читать далее ▸


Толстые хвосты

Эта статья — Jupyter-блокнот, в котором я пытаюсь обобщить текущий уровень моего понимания статистических распределений с толстыми хвостами, популярно описанных у Нассима Талеба и Бенуа Мандельброта.

Загрузим хитро подготовленные данные:

import numpy as np
data = np.loadtxt('data/fat-tails.tsv')

И посмотрим на гистограмму:

from matplotlib import pyplot as plt
plt.rcParams['figure.figsize'] = (8, 2)
plt.rcParams['figure.dpi'] = 144

def plot_hist():
    plt.hist(data, bins=35, density=True, color='silver')

plt.figure()
plot_hist()
plt.show()

Ходят неподтверждённые слухи, что большинство людей, если видят подобный холм, сразу хотят натянуть на него нормальное распределение. Давайте и мы начнём с такого упражнения.

Читать далее ▸


Pareto Front

В повседневной жизни мы регулярно оказываемся в ситуациях, когда хочется и рыбку съесть, и косточкой не подавиться:

  • Не прогадать по цене/качеству, переключаясь в маркетплейсе между “подешевле” и “много звёздочек”.
  • Вложить деньги в какую-нибудь пирамиду с оптимальным соотношением риск/доходность.

На языке науки это называется multi-objective optimization — многофакторная/многокритериальная оптимизация.

Читать далее ▸