Мой личный бложек. Пишу о жизни в Чехии, программировании и просто свои мысли обо всём. Пишу не часто.

 
~ или Appender?
Заметки не программиста
Lang:
string s;
for (size_t i = 0; i < 1000; i++)
{
s += 'x';
}

// или
Appender!string s;
s.reserve(1000);
for (size_t i = 0; i < 1000; i++)
{
s += 'x';
}


Я сравниваю не appender из phobos, а Appender из нашего фреймворка, он немного отличается.

Сторонники Appender'а аргументируют выбор, тем что он реже вызывает GC.alloc, а если размер памяти заранее известен, то память выделяется 1 раз при вызове reserve(). Однако, массивы в D (и тип string в том числе) имеют свойство .capacity, и если его вывести на экран, то видно что массив тоже увеличивает свою память не на +1, а блоками, так что GC.alloc тоже не каждый раз вызывается.

Моё мнение:
Для небольших массивов <256KB разница в скорости особо не заметна, к тому же конкатенация генерирует меньше кода, чем использование Appender. Да и GC.alloc работает достаточно быстро.

Appender стоит использовать в буфферах чтения/записи, когда происходит очень интенсивный обмен данными. А также на больших объёмах данных >=256KB.
0