TGStat
TGStat
Qidiruv uchun matnni kiriting
Ilg‘or kanal qidiruvi
  • flag Uzbek
    Sayt tili
    flag Russian flag English flag Uzbek
  • Saytga kirish
  • Katalog
    Kanal va guruhlar katalogi Hududiy to‘plamlar Tematik to‘plamlar Платные каналы Kanallar qidiruvi
    Kanal/guruh qo‘shish
  • Reytinglar
    Kanallar reytingi Guruhlar reytingi Postlar reytingi
    Brendlar va shaxslar reytingi
  • Analitika
  • Postlarda qidiruv
  • Telegram'ni kuzatish
  • Targ‘ibot
    Yandex Business orqali reklama TGStat Agency orqali kanallarda reklama TGStat.ru saytida reklama
C# Heppard

20 Apr 2024, 15:30

Telegram'da ochish Ulashish Shikoyat qilish

Напоминаю про чудесный ValueStringBuilder, который находится в недрах .NET и является internal. Это идеальная вещь для замены StringBuilder на коротких строках. Фактически, он является одним из распространённых подходов к написанию zero-allocation кода.

Чтобы его использовать в своём приложении необходимо... просто скопировать его код из репозитория .NET.

Штука до боли простая - это ref struct, которая принимает в конструктор Span. Обычно его создают на стеке путём stackallock char[256]. Если в процессе создания строки выяснятся, что переданного Span не хватает - используется честный массив из ArrayPool.


internal ref partial struct ValueStringBuilder {
private char[]? _arrayToReturnToPool;
private Span _chars;
private int _pos;

public ValueStringBuilder(Span initialBuffer)
{
_arrayToReturnToPool = null;
_chars = initialBuffer;
_pos = 0;
}

...

private void Grow(int additionalCapacityBeyondPos)
{
int newCapacity = _pos + additionalCapacityBeyondPos);
char[] poolArray = ArrayPool.Shared.Rent(newCapacity);
...
}

Далее мы можем работать с ValueStringBuilder'ом так, будто это обычный StringBuilder - у них очень похожие API. Во многом благодаря новому интерфейсу ISpanFormattable и вот этому методу. Пример использования:


var vsb = new ValueStringBuilder(stackallock char[256]);
vsb.AppendSpanFormattable(DateTime.Now);
vsb.Append(5)
Наполнив ValueStringBuilder, не спешим создавать из него строку - в современном .NET много где принимают ReadOnlySpan, а значит нам не нужно делать ToString. Для использования собранных char'иков, нужно лишь передать их в необходимое место, используя метод AsSpan.

Однако, не всё радужно. ValueStringBuilder штука особенная, а значит требует особого использования:
1. Мы создаём Span на stack'e, а он не резиновый. Это значит, что создавая первоначальный буффер размером в 1024 символа мы несколько рискуем.
2. После завершения работы необходимо ВСЕГДА вызывать ToString или Dispose, чтобы точно вернуть внутренний массив обратно в пул. Был он взят или нет - мы не знаем.

P.S.: Когда на собеседованиях я спрашиваю про то, как создать строку с минимальными аллокациями, то я считаю ответ про StringBuilder правильным, но на 4. Ответ на 5 - ValueStringBuilder. Наверное, так делаю не только я.

P.P.S: Если вы хотите сразу перейти к тому, к чему я веду в нескольких постах про ValueStringBuilder - см. 'https://t.me/csharp_gepard/88?comment=615' rel='nofollow'>вот этот комментарий. Интриги не будет, но вы научитесь использовать современные штуки .NET.

#память

5.5k 1 68 16 22
Katalog
Kanal va guruhlar katalogi Kanallar to‘plamlari Kanallar qidiruvi Kanal/guruh qo‘shish
Reytinglar
Telegram-kanallar reytingi Telegram-guruhlar reytingi Postlar reytingi Brendlar va shaxslar reytingi
API
Statistika API'si Postlar qidiruvi API'si API Callback
Kanallarimiz
@TGStat @TGStat_Chat @telepulse @TGStatAPI
O‘qish
Академия TGStat Telegram tadqiqoti 2019 Telegram tadqiqoti 2021 Telegram tadqiqoti 2023
Kontaktlar
Справочный центр Qo‘llab-quvvatlash Email Vakansiyalar
Har xil narsalar
Foydalanuvchi shartnomasi Maxfiylik siyosati Ommaviy oferta
Botlarimiz
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot