gobwas / ws

Tiny WebSocket library for Go.
MIT License
6.12k stars 376 forks source link

Cipher 1.9x speedup #198

Closed klauspost closed 5 months ago

klauspost commented 5 months ago

Simplify cipher loop and unroll once.

λ benchcmp before.txt after.txt | grep -v "naive"
benchmark                                          old ns/op     new ns/op     delta
BenchmarkCipher/bytes=7;offset=1-32                7.17          7.79          +8.65%
BenchmarkCipher/bytes=125;offset=0-32              24.5          23.1          -6.07%
BenchmarkCipher/bytes=1024;offset=0-32             126           63.4          -49.87%
BenchmarkCipher/bytes=4096;offset=0-32             462           244           -47.26%
BenchmarkCipher/bytes=4100;offset=4-32             460           249           -45.93%
BenchmarkCipher/bytes=4099;offset=3-32             463           250           -45.93%
BenchmarkCipher/bytes=32775;offset=49-32           3619          1936          -46.50%

benchmark                                          old MB/s     new MB/s     speedup
BenchmarkCipher/bytes=7;offset=1-32                976.74       898.93       0.92x
BenchmarkCipher/bytes=125;offset=0-32              5092.84      5423.57      1.06x
BenchmarkCipher/bytes=1024;offset=0-32             8103.00      16159.29     1.99x
BenchmarkCipher/bytes=4096;offset=0-32             8870.86      16818.08     1.90x
BenchmarkCipher/bytes=4100;offset=4-32             8917.63      16491.32     1.85x
BenchmarkCipher/bytes=4099;offset=3-32             8854.38      16379.58     1.85x
BenchmarkCipher/bytes=32775;offset=49-32           9056.37      16926.83     1.87x

I tried a few variations, but this seemed fine without too many changes.

klauspost commented 5 months ago

Seems like autobahn is a bit flaky.

cristaloleg commented 5 months ago

Yeah, it's:(