Tinkoff / invest-openapi-csharp-sdk

Apache License 2.0
100 stars 33 forks source link

Optimize streaming events receiving #69

Closed olsh closed 3 years ago

olsh commented 3 years ago

Небольшая оптимизация получения стриминг эвентов. Результаты синтетического теста. На ~30% меньше выделение памяти и на ~7% меньше расхода CPU.

Method Mean Error StdDev Ratio Gen 0 Gen 1 Gen 2 Allocated
Original 8.796 μs 0.0766 μs 0.0679 μs 1.00 0.9918 - - 3.08 KB
Optimized 8.199 μs 0.1015 μs 0.0900 μs 0.93 0.7019 - - 2.17 KB
olsh commented 3 years ago

@rus-art я обновил PR. Использовал подход где внутренний массив в MemoryStream не резайзится (почти). Думаю что это будет лучше подхода с SetLength в моем первоначальном варианте и вашем. Дайте знать что думаете по этому поводу.

Финальные замеры

Method Mean Error StdDev Ratio Gen 0 Gen 1 Gen 2 Allocated
Original 8.744 μs 0.0476 μs 0.0422 μs 1.00 0.9918 - - 3.08 KB
Optimized 7.796 μs 0.0445 μs 0.0371 μs 0.89 0.6104 - - 1.88 KB

Вторая серьезная аллокация происходит тут, предлагаю исправить ее отдельным PR.

olsh commented 3 years ago

@rus-art дадим этому PR движение? :)

olsh commented 3 years ago

@rus-art я обновил PR, теперь копирование не будет происходить если сообщение полностью поместилось в буффер (на самом деле я не видел сообщений больше буффера, так что, вероятно, всегда будет так). MemoryStream используется как фоллбек если все таки пришло большое сообщение.

rus-art commented 3 years ago

@olsh Спасибо, мержу

olsh commented 3 years ago

@rus-art размер буфера поправил.