Hello, 

trying to implement a fast cache, I inadvertently entered a rabbit hole 
that led me to implement my own map. In the process I tried to make it 
faster than the go map just to see if it is possible. I worked weeks on it 
trying out various architectures and methods. 

On my mac book air M2, I get the following benchmarks for a Get operation. 
The numbers are the number of items inserted in the table.  My keys are 8 
byte long strings. 

goos: darwin
goarch: arm64
pkg: fastCache/map
cpu: Apple M2
                     │ dirstr12/stats_arm64.txt │     
 puremapstr/stats_arm64.txt       │
                     │          sec/op          │    sec/op      vs base   
             │
Cache2Hit/_______1-8               6.151n ±  6%    7.087n ±  1%   +15.22% 
(p=0.002 n=6)
Cache2Hit/______10-8               8.491n ±  0%    8.156n ± 29%         ~ 
(p=0.394 n=6)
Cache2Hit/_____100-8               8.141n ±  7%   14.185n ± 13%   +74.24% 
(p=0.002 n=6)
Cache2Hit/____1000-8               8.252n ±  3%   10.635n ± 39%   +28.89% 
(p=0.002 n=6)
Cache2Hit/___10000-8               10.45n ±  2%    20.99n ±  4%  +100.81% 
(p=0.002 n=6)
Cache2Hit/__100000-8               12.16n ±  1%    19.11n ± 10%   +57.05% 
(p=0.002 n=6)
Cache2Hit/_1000000-8               42.28n ±  2%    47.90n ±  2%   +13.29% 
(p=0.002 n=6)
Cache2Hit/10000000-8               56.38n ± 12%    61.82n ±  6%         ~ 
(p=0.065 n=6)
geomean                            13.44n          17.86n         +32.91%

On my amd64 i5 11th gen I get the following benchmarks.

goos: linux
goarch: amd64
pkg: fastCache/map
cpu: 11th Gen Intel(R) Core(TM) i5-11400 @ 2.60GHz
                      │ dirstr12/stats_amd64.txt │     
 puremapstr/stats_amd64.txt      │
                      │          sec/op          │    sec/op      vs base   
            │
Cache2Hit/_______1-12               9.207n ±  1%    7.506n ±  3%  -18.48% 
(p=0.002 n=6)
Cache2Hit/______10-12               9.223n ±  0%    8.806n ±  6%        ~ 
(p=0.058 n=6)
Cache2Hit/_____100-12               9.279n ±  2%   10.175n ±  3%   +9.66% 
(p=0.002 n=6)
Cache2Hit/____1000-12               10.45n ±  2%    11.29n ±  3%   +8.04% 
(p=0.002 n=6)
Cache2Hit/___10000-12               16.00n ±  2%    17.21n ±  5%   +7.59% 
(p=0.002 n=6)
Cache2Hit/__100000-12               22.20n ± 17%    24.73n ± 22%  +11.42% 
(p=0.026 n=6)
Cache2Hit/_1000000-12               87.75n ±  2%    91.05n ±  5%   +3.76% 
(p=0.009 n=6)
Cache2Hit/10000000-12               104.2n ±  2%    105.6n ±  5%        ~ 
(p=0.558 n=6)
geomean                             20.11n          20.49n         +1.90%

On amd64 the performance is on par with go map, but go map uses inlined 
simd instructions which I don’t use because I don’t have access to it in 
pure go. I use xxh3 right out of the box for the hash function. The 
differences are not due to the hash function.

If there is interest in this, please let me know.



-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/1ce56ac2-662c-410f-a25a-b0ed09a706a4n%40googlegroups.com.

Reply via email to