Давно я сюда не писал, обходился Telegram и Twitter, но поля их слишком малы, чтобы вместить эту статью :)
Для небольшого исследования в области упаковки чисел мне понадобилось получить минимальное количество бит, требуемое для записи числа.
Его, конечно, математически можно получить с помощью двоичного логарифма “округлённого к большему целому” (буду использовать обозначение lg n).
Как вы, вероятно, знаете, в .NET Core 3.0 появились intrinsic’и[1], в частности, LZCNT. Она, конечно, возвращает leading zeroes,
но вычесть-то из 31 (для индекса в каком-нибудь массиве) или из 32 (для количества бит на число) недолго.
Однако, мне было интересно узнать и универсальное решение. В .NET Core 3.0, к счастью, добавили для этого класс BitOperations[2].
А мне, конечно же, захотелось посмотреть его исходники…
Рекомендую к прочтению статьи об исключениях в .NET. Точно стоит прочитать первую статью — Исключения: архитектура системы типов.
В ней много полезного, особенно — для новичков. Остальные тоже можно, если эта тема интересует:
Недавно вышла статья System.IO.Pipelines: High performance IO in .NET.
Она про то, как реализовать более наглядную и быструю работу со стримами в .NET Core 2.1.
От слишком краткого пересказа статья многое потеряет — читайте оригинал. Ладно, будем честными — я сегодня подустал, поэтому бегло её прочитал и не очень разбирался :)
В .NET Core 2.1 добавили новый флаг BindingFlags.DoNotWrapExceptions.
Странно, что в документации этот флаг не описан.
Хотя, чему я удивляюсь, пора бы привыкнуть.
Если вкратце, с этим флагом Reflection не заворачивает исключения в TargetInvocationException.
Подробности можно прочитать на GitHub.
CoreRT — поддержка native code для .NET Core.
Слишком коротко. Ладно, это проект, который делает из сборок для .NET Core машинный код.
И собирает в один файл вместе с рантаймом. Пока альфа.
Если хотите чуть больше подробностей — читайте дальше.
Рассказ, как обычно, будет коротким. Но со списком статей для дополнительного изучения :)
Пара статей Сергея Теплякова и мотивировала меня написать этот краткий конспект на русском языке.
Если вы готовы прочитать эту интересную, но огромную статью — прочитайте. Я всё-таки пристрастен и расскажу о том, что интересно лично мне.
А если не хотите читать и короткую…
TL&DR; Значительно (в 1.5-2 раза) улучшена производительность многих вещей, в том числе:
Структуры (Value types). Это ключевые изменения, многие оптимизации сделаны за счет Span<T> и Memory<T>.
Сравнения. Также оптимизированы сравнения внутри Dictionary .
Строки — оптимизированы не только сравнения, но и такие штуки как ToLower, Format и Parse.
Недавно я долго и мучительно переходил с .NET Core 1.x на 2.0. Возможно, расскажу об этом позже. Признаться, об этом лучше рассказывать в удобном кресле психоаналитика :)
Сегодня о более прозаичном. В нашей компании мы привыкли использовать TeamCity и NUnit. Для предыдущей версии .NET Core работал пакет “dotnet-test-nunit-teamcity”, для новой аналога не нашлось…
С удовольствием прочитал статью High-performance .NET by example: Filtering bot traffic.
Кстати, к ботам статья почти не имеет отношения, а вот к улучшению производительности — очень даже. В частности,
есть примеры использования BenchmarkDotNet, PerfView, Intel VTune Amplifier, ILSpy, WinDbg и unsafe-кода.
Знаете ли вы, какой будет уровень изоляции, когда вы откроете соединение (для определённости — SqlConnection)? Вопрос с подвохом.
Правильный ответ, как обычно — It depends.
Сегодня про опыт (мой и моих коллег) и впечатления о .NET Core.
На всякий (почти невероятный) случай кратко о том, что это такое.
Microsoft сделал фреймворк для кросcплатформенной разработки. Построил его на немного других принципах — сделал более
гранулированным (говоря попросту — нарезали большие DLL-ки помельче), кое-что ещё поменяли.
В итоге имеем возможность писать более быстрые (в том числе, потому что не тянем лишнего) и компактные кроссплатформенные приложения.
Проверяли под Windows и Linux — вполне работает. Маководов не было рядом :)
Сегодня о TransactionScope, уровне изоляции транзакций Serializable и дырявых абстракциях.
Вообще говоря, я раньше много раз сталкивался с распределёнными транзакциями.
В какой-то момент я окончательно сформировал своё мнение по этой теме. Получилось что-то вроде: “хватит, я не буду их использовать вообще, разве что в ход со стороны оппонента пойдут огнестрельное оружие и прочие нечестные аргументы”.
По этой причине моё знакомство с TransactionScope
свелось к его использованию в интеграционных тестах (без распределённой составляющей, просто для удобного отката транзакций)
и редким спорам с коллегами. Но сегодня, внезапно…