Я думаю, это потому, что ваш Seq
является структурой (тип-значения) и работает оператор приращения пути. Как видите, public static Seq operator ++(Seq a) { ... }
- это , возвращающий экземпляр вашей структуры Seq
. Однако, поскольку структуры передаются по значению, фактически создается новый экземпляр Seq
, который возвращается, и вот ваши издержки.
Взгляните на другой пример:
struct SeqStruct
{
private uint _num;
public void Increment() => _num++;
}
// ----------------------------------
var seq = new SeqStruct();
var stopwatch = Stopwatch.StartNew();
for (int i = 0; i < 100000000; i++)
seq.Increment();
s3.Stop();
Теперь, если вы измерите время вызова метода Increment()
, вы можете увидеть, что оно теперь ближе к «чистому» приращению uint, и если вы переключитесь на Release конфигурацию сборки, у вас будет то же самое время, что и «чистое» увеличение uint (этот метод был «встроенным»).
Другой вариант - использовать class
вместо struct
:
class SeqClass
{
private uint _num;
public static SeqClass operator ++(SeqClass a) { a._num++; return a; }
}
Теперь увеличение будет выполняться быстрее.