Closed mdavidsaver closed 1 year ago
:x: Build pvxs 1.0.810 failed (commit https://github.com/mdavidsaver/pvxs/commit/05d3d00b33 by @mdavidsaver)
Reworked FreeList to avoid MSVC complications. Now a single malloc()
for each Struct
instance. Including ref-counter, but excepting std::string
and shared_array
members. Comes at the cost of manual ref. counting, with the risks this entails.
:white_check_mark: Build pvxs 1.0.815 completed (commit https://github.com/mdavidsaver/pvxs/commit/db88c87a88 by @mdavidsaver)
Partially merged as of b0c36f365e7951e2bcce7f026cfeb80c74839683
The remaining unmerged optimization is FreeList for Value. Expanding the benchdata
microbenchmark shows a ~50% reduction (2.2us -> 1.2us) in the time needed to allocate an empty NTScalar from a FreeList (Linux/amd64, GCC -O3
). Times in nanoseconds.
circa 6b2f0918e3d117ca9a4b95fbed52cdc5a9160b19
$ ./test/O.linux-x86_64/benchdata
# benchAllocNTScalar
# N=1000 2209.29 +- 1781.44 [956, 16080] first=5403
...
With this PR
$ ./test/O.linux-x86_64/benchdata
# benchAllocNTScalar
# raw alloc N=1000 2273.32 +- 1941.03 [970, 21297] first=8999
# fl alloc N=1000 1288.17 +- 162.47 [1181, 5625] first=5625
...
:x: Build pvxs 1.0.817 failed (commit https://github.com/mdavidsaver/pvxs/commit/1df3f57b4b by @mdavidsaver)
:white_check_mark: Build pvxs 1.0.824 completed (commit https://github.com/mdavidsaver/pvxs/commit/1da4fa6086 by @mdavidsaver)
:x: Build pvxs 1.0.827 failed (commit https://github.com/mdavidsaver/pvxs/commit/50e3173f70 by @mdavidsaver)
This final iteration switches to a different approach to a Value
free-list for client subscriptions. Complete Value
instead of void*
.
Merged as 8972e93a35f30c136d3ef4b6f7c77d657cce4bba
Some prospective optimizations reducing overheads. In a testable state.
record[pipeline=true]
.pop()
to allow clients to remove more than one subscription update with one call.readv()
/writev()
syscalls (libevent >= 2.1).Value
.