Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add string interning to SyncIterator #3411

Merged
merged 14 commits into from
Feb 27, 2024
Merged

Conversation

mapno
Copy link
Member

@mapno mapno commented Feb 20, 2024

What this PR does:

Adds string ([]byte actually) interning in the SyncIterator for pq.Values of kind ByteArray and FixedLenByteArray. This saves allocations when the same string is repeated multiple times, which is very frequent.

The interning logic is contained in /pkg/parquetquery/intern. Interner is not concurrent-safe and uses unsafe code for converting between types (string, []byte, *byte) with minimal overhead.

Benchmark results

main vs branch

goos: darwin
goarch: arm64
pkg: github.com/grafana/tempo/tempodb/encoding/vparquet3
                                                                             │   old.txt   │              new.txt              │
                                                                             │   sec/op    │   sec/op     vs base              │
BackendBlockQueryRange/{}_|_rate()/1-12                                        84.74m ± 1%   82.97m ± 5%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()/2-12                                        311.2m ± 8%   301.3m ± 1%  -3.17% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/3-12                                        304.1m ± 6%   304.5m ± 1%       ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()/4-12                                        302.6m ± 1%   305.7m ± 1%  +1.01% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()/5-12                                        303.7m ± 1%   309.6m ± 1%  +1.97% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/6-12                                        332.2m ± 7%   309.5m ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()/7-12                                        325.2m ± 5%   311.6m ± 1%  -4.18% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/8-12                                        323.9m ± 1%   310.5m ± 1%  -4.15% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                              152.7m ± 4%   150.9m ± 1%  -1.18% (p=0.009 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              543.8m ± 4%   545.0m ± 1%       ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              602.3m ± 3%   604.0m ± 2%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              657.6m ± 3%   658.4m ± 1%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              713.3m ± 0%   714.0m ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              771.2m ± 0%   764.6m ± 1%  -0.86% (p=0.015 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              794.3m ± 2%   792.3m ± 5%       ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              803.3m ± 0%   805.5m ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12             115.3m ± 7%   114.1m ± 0%  -1.06% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12             392.2m ± 1%   397.9m ± 7%  +1.44% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12             453.7m ± 1%   454.3m ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12             504.1m ± 1%   505.1m ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12             560.4m ± 1%   558.1m ± 1%       ~ (p=0.240 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12             610.7m ± 2%   602.3m ± 0%  -1.38% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12             631.1m ± 2%   625.6m ± 0%       ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12             641.3m ± 1%   642.4m ± 5%       ~ (p=0.589 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12   58.16m ± 0%   58.05m ± 0%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12   114.2m ± 1%   113.3m ± 1%       ~ (p=0.180 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12   114.5m ± 1%   114.5m ± 2%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12   114.8m ± 3%   114.6m ± 4%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12   118.3m ± 4%   114.9m ± 0%  -2.87% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12   115.7m ± 1%   115.6m ± 2%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12   115.8m ± 1%   116.9m ± 2%       ~ (p=0.394 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12   116.2m ± 1%   115.7m ± 1%       ~ (p=0.485 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/1-12                            101.0m ± 0%   100.8m ± 0%       ~ (p=0.180 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/2-12                            137.4m ± 0%   137.7m ± 0%  +0.26% (p=0.041 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/3-12                            137.6m ± 0%   138.0m ± 0%  +0.29% (p=0.004 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/4-12                            137.6m ± 1%   138.1m ± 2%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/5-12                            138.2m ± 0%   138.0m ± 0%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/6-12                            138.5m ± 0%   138.1m ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/7-12                            138.4m ± 0%   138.0m ± 0%  -0.29% (p=0.015 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/8-12                            138.3m ± 0%   137.9m ± 0%       ~ (p=0.065 n=6)
geomean                                                                        248.6m        247.1m       -0.61%

                                                                             │  old.txt   │              new.txt               │
                                                                             │  MB_IO/op  │  MB_IO/op   vs base                │
BackendBlockQueryRange/{}_|_rate()/1-12                                        16.33 ± 0%   16.33 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/2-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/3-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/4-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/5-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/6-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/7-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/8-12                                        15.64 ± 0%   15.64 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                              20.25 ± 0%   20.25 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              19.57 ± 0%   19.57 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12             16.53 ± 0%   16.53 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12             15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12   16.53 ± 0%   16.53 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12   15.85 ± 0%   15.85 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/1-12                            17.51 ± 0%   17.51 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/2-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/3-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/4-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/5-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/6-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/7-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/8-12                            16.83 ± 0%   16.83 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                                        16.77        16.77       +0.00%
¹ all samples are equal

                                                                             │   old.txt   │               new.txt               │
                                                                             │  spans/op   │  spans/op    vs base                │
BackendBlockQueryRange/{}_|_rate()/1-12                                        142.1k ± 0%   142.1k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/2-12                                        345.2k ± 0%   345.2k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/3-12                                        634.5k ± 0%   634.5k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/4-12                                        909.8k ± 0%   909.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/5-12                                        1.223M ± 0%   1.223M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/6-12                                        1.507M ± 0%   1.507M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/7-12                                        1.645M ± 0%   1.645M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()/8-12                                        1.694M ± 0%   1.694M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                              142.1k ± 0%   142.1k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              345.2k ± 0%   345.2k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              634.5k ± 0%   634.5k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              909.8k ± 0%   909.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              1.223M ± 0%   1.223M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              1.507M ± 0%   1.507M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              1.645M ± 0%   1.645M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              1.694M ± 0%   1.694M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12             142.1k ± 0%   142.1k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12             345.2k ± 0%   345.2k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12             634.5k ± 0%   634.5k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12             909.8k ± 0%   909.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12             1.223M ± 0%   1.223M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12             1.507M ± 0%   1.507M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12             1.645M ± 0%   1.645M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12             1.694M ± 0%   1.694M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12   19.86k ± 0%   19.86k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12   58.49k ± 0%   58.49k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12   96.56k ± 0%   96.56k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12   144.9k ± 0%   144.9k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12   248.8k ± 0%   248.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12   290.2k ± 0%   290.2k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12   316.5k ± 0%   316.5k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12   321.8k ± 0%   321.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/1-12                            17.80k ± 0%   17.80k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/2-12                            43.26k ± 0%   43.26k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/3-12                            74.89k ± 0%   74.89k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/4-12                            107.1k ± 0%   107.1k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/5-12                            136.3k ± 0%   136.3k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/6-12                            172.8k ± 0%   172.8k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/7-12                            185.7k ± 0%   185.7k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{status=error}_|_rate()/8-12                            191.1k ± 0%   191.1k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                                        360.5k        360.5k       +0.00%
¹ all samples are equal

                                                                             │   old.txt   │              new.txt              │
                                                                             │   spans/s   │   spans/s    vs base              │
BackendBlockQueryRange/{}_|_rate()/1-12                                        1.677M ± 1%   1.712M ± 4%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()/2-12                                        1.109M ± 8%   1.146M ± 1%  +3.27% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/3-12                                        2.086M ± 5%   2.084M ± 1%       ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()/4-12                                        3.007M ± 1%   2.976M ± 1%  -1.00% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()/5-12                                        4.029M ± 1%   3.951M ± 1%  -1.93% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/6-12                                        4.538M ± 8%   4.870M ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()/7-12                                        5.057M ± 5%   5.278M ± 1%  +4.37% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()/8-12                                        5.230M ± 1%   5.456M ± 1%  +4.33% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                              930.4k ± 4%   941.5k ± 1%  +1.19% (p=0.009 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              634.8k ± 4%   633.4k ± 1%       ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              1.053M ± 3%   1.051M ± 2%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              1.384M ± 3%   1.382M ± 1%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              1.715M ± 0%   1.714M ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              1.954M ± 0%   1.971M ± 1%  +0.87% (p=0.015 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              2.071M ± 2%   2.076M ± 5%       ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              2.109M ± 0%   2.103M ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12             1.232M ± 7%   1.245M ± 0%  +1.07% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12             879.9k ± 1%   867.5k ± 6%  -1.42% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12             1.399M ± 1%   1.397M ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12             1.805M ± 1%   1.801M ± 1%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12             2.183M ± 1%   2.192M ± 1%       ~ (p=0.240 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12             2.468M ± 2%   2.503M ± 0%  +1.40% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12             2.606M ± 2%   2.629M ± 0%       ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12             2.641M ± 1%   2.637M ± 5%       ~ (p=0.589 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12   341.4k ± 0%   342.1k ± 0%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12   512.3k ± 1%   516.0k ± 1%       ~ (p=0.180 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12   843.4k ± 1%   843.5k ± 2%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12   1.262M ± 3%   1.264M ± 3%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12   2.104M ± 4%   2.166M ± 0%  +2.95% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12   2.509M ± 1%   2.510M ± 2%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12   2.733M ± 1%   2.707M ± 2%       ~ (p=0.394 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12   2.769M ± 1%   2.780M ± 1%       ~ (p=0.485 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/1-12                            176.3k ± 0%   176.6k ± 0%       ~ (p=0.180 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/2-12                            314.9k ± 0%   314.1k ± 0%  -0.26% (p=0.041 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/3-12                            544.0k ± 0%   542.5k ± 0%  -0.28% (p=0.004 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/4-12                            778.2k ± 1%   775.3k ± 2%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/5-12                            985.8k ± 0%   987.7k ± 0%       ~ (p=0.065 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/6-12                            1.248M ± 0%   1.251M ± 1%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/7-12                            1.342M ± 0%   1.346M ± 0%  +0.29% (p=0.015 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/8-12                            1.382M ± 0%   1.385M ± 0%       ~ (p=0.065 n=6)
geomean                                                                        1.450M        1.459M       +0.62%

                                                                             │    old.txt     │               new.txt                │
                                                                             │      B/op      │     B/op       vs base               │
BackendBlockQueryRange/{}_|_rate()/1-12                                         29.88Mi ±  7%   29.87Mi ±  7%        ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()/2-12                                         50.35Mi ±  9%   49.20Mi ±  9%        ~ (p=0.485 n=6)
BackendBlockQueryRange/{}_|_rate()/3-12                                         49.37Mi ± 10%   49.33Mi ±  4%        ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()/4-12                                         50.09Mi ±  9%   48.29Mi ±  4%        ~ (p=0.180 n=6)
BackendBlockQueryRange/{}_|_rate()/5-12                                         49.45Mi ± 10%   49.59Mi ±  9%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()/6-12                                         50.89Mi ±  9%   49.77Mi ± 11%        ~ (p=0.240 n=6)
BackendBlockQueryRange/{}_|_rate()/7-12                                         52.31Mi ±  8%   53.19Mi ± 12%        ~ (p=0.589 n=6)
BackendBlockQueryRange/{}_|_rate()/8-12                                         51.03Mi ±  6%   49.10Mi ±  6%        ~ (p=0.240 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                               38.89Mi ±  2%   32.81Mi ± 11%  -15.62% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              118.11Mi ± 11%   51.93Mi ± 11%  -56.04% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              118.76Mi ± 12%   53.10Mi ± 15%  -55.29% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              121.06Mi ±  9%   49.98Mi ± 21%  -58.71% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              116.87Mi ± 11%   57.63Mi ± 10%  -50.69% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              122.96Mi ± 15%   52.99Mi ±  7%  -56.90% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              111.95Mi ±  9%   52.74Mi ± 13%  -52.89% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              115.65Mi ± 16%   51.90Mi ± 14%  -55.13% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12              33.44Mi ±  4%   32.56Mi ±  4%        ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12              53.41Mi ±  8%   49.03Mi ± 13%        ~ (p=0.180 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12              50.24Mi ±  8%   47.32Mi ± 22%        ~ (p=0.394 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12              57.15Mi ± 19%   53.70Mi ± 15%        ~ (p=0.485 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12              61.57Mi ± 22%   58.07Mi ± 13%        ~ (p=0.394 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12              55.64Mi ± 20%   56.57Mi ± 17%        ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12              53.77Mi ± 31%   50.17Mi ± 19%        ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12              55.60Mi ± 17%   50.17Mi ± 11%        ~ (p=0.310 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12    26.95Mi ±  4%   27.10Mi ±  4%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12    35.69Mi ±  6%   35.66Mi ±  5%        ~ (p=0.937 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12    36.52Mi ±  6%   35.43Mi ±  7%        ~ (p=0.093 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12    37.57Mi ±  7%   35.29Mi ± 12%        ~ (p=0.240 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12    36.57Mi ±  6%   34.89Mi ± 12%        ~ (p=0.240 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12    36.56Mi ±  7%   35.63Mi ±  4%        ~ (p=0.240 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12    35.50Mi ±  6%   35.68Mi ±  9%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12    36.93Mi ±  6%   34.84Mi ±  5%   -5.65% (p=0.026 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/1-12                             33.33Mi ±  4%   33.75Mi ±  9%        ~ (p=0.937 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/2-12                             27.47Mi ±  8%   29.47Mi ±  7%        ~ (p=0.132 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/3-12                             28.23Mi ±  3%   28.88Mi ±  7%        ~ (p=0.485 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/4-12                             28.54Mi ±  6%   28.34Mi ±  6%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/5-12                             28.39Mi ±  8%   29.17Mi ±  5%        ~ (p=0.310 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/6-12                             28.35Mi ±  9%   28.94Mi ±  6%        ~ (p=0.132 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/7-12                             28.76Mi ±  3%   28.03Mi ± 10%        ~ (p=0.310 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/8-12                             27.58Mi ±  6%   27.43Mi ± 10%        ~ (p=0.937 n=6)
geomean                                                                         47.99Mi         40.86Mi        -14.86%

                                                                             │   old.txt    │               new.txt               │
                                                                             │  allocs/op   │  allocs/op    vs base               │
BackendBlockQueryRange/{}_|_rate()/1-12                                         363.5k ± 0%   363.2k ±  0%        ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()/2-12                                         385.5k ± 2%   385.6k ±  4%        ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()/3-12                                         382.4k ± 2%   383.4k ±  1%        ~ (p=0.818 n=6)
BackendBlockQueryRange/{}_|_rate()/4-12                                         384.3k ± 2%   384.1k ±  2%        ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()/5-12                                         383.6k ± 4%   384.2k ±  2%        ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()/6-12                                         384.5k ± 1%   387.1k ±  6%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()/7-12                                         384.9k ± 2%   386.2k ±  3%        ~ (p=0.394 n=6)
BackendBlockQueryRange/{}_|_rate()/8-12                                         383.9k ± 3%   382.0k ±  2%        ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/1-12                               554.1k ± 1%   384.6k ±  1%  -30.59% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/2-12                              2284.0k ± 3%   394.7k ±  5%  -82.72% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/3-12                              2272.6k ± 3%   409.8k ± 10%  -81.97% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/4-12                              2306.1k ± 1%   395.6k ± 14%  -82.85% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/5-12                              2299.3k ± 4%   413.8k ±  4%  -82.00% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/6-12                              2284.4k ± 3%   404.0k ±  2%  -82.31% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/7-12                              2254.9k ± 4%   404.5k ± 12%  -82.06% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(name)/8-12                              2280.7k ± 2%   395.5k ± 15%  -82.66% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/1-12              409.7k ± 0%   384.7k ±  0%   -6.10% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/2-12              612.3k ± 5%   376.9k ±  6%  -38.45% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/3-12              601.1k ± 3%   376.9k ±  5%  -37.30% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/4-12              637.1k ± 7%   399.8k ± 12%  -37.26% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/5-12              634.3k ± 6%   417.8k ±  7%  -34.13% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/6-12              624.1k ± 8%   427.9k ± 13%  -31.43% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/7-12              631.4k ± 5%   392.5k ± 14%  -37.85% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(resource.service.name)/8-12              631.5k ± 5%   392.5k ±  7%  -37.85% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/1-12    353.7k ± 0%   350.0k ±  0%   -1.04% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/2-12    397.5k ± 1%   347.9k ±  2%  -12.49% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/3-12    397.9k ± 2%   345.9k ±  2%  -13.07% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/4-12    401.3k ± 1%   346.7k ±  2%  -13.60% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/5-12    397.9k ± 2%   349.7k ±  1%  -12.12% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/6-12    397.9k ± 2%   349.9k ±  1%  -12.08% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/7-12    397.5k ± 1%   347.0k ±  2%  -12.70% (p=0.002 n=6)
BackendBlockQueryRange/{resource.service.name=`loki-ingester`}_|_rate()/8-12    405.4k ± 2%   349.2k ±  1%  -13.85% (p=0.002 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/1-12                             390.5k ± 0%   390.5k ±  0%        ~ (p=0.699 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/2-12                             349.8k ± 1%   354.1k ±  1%   +1.24% (p=0.009 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/3-12                             352.5k ± 0%   352.6k ±  1%        ~ (p=0.937 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/4-12                             352.9k ± 1%   351.8k ±  1%        ~ (p=0.589 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/5-12                             353.1k ± 1%   353.4k ±  1%        ~ (p=0.818 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/6-12                             352.6k ± 1%   352.8k ±  1%        ~ (p=0.589 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/7-12                             352.7k ± 1%   351.3k ±  1%        ~ (p=0.394 n=6)
BackendBlockQueryRange/{status=error}_|_rate()/8-12                             350.5k ± 1%   352.4k ±  1%        ~ (p=0.485 n=6)
geomean                                                                         570.9k        376.1k        -34.12%

Which issue(s) this PR fixes:
Fixes #

Checklist

  • Tests updated
  • Documentation added
  • CHANGELOG.md updated - the order of entries should be [CHANGE], [FEATURE], [ENHANCEMENT], [BUGFIX]

@@ -933,7 +937,7 @@ func (c *SyncIterator) makeResult(t RowNumber, v *pq.Value) *IteratorResult {
r := GetResult()
r.RowNumber = t
if c.selectAs != "" {
r.AppendValue(c.selectAs, v.Clone())
r.AppendValue(c.selectAs, c.interner.UnsafeClone(v))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

on a very high cardinality column will this be slower than just cloning?

should we compare the dictionary length to the page length and decide whether to intern or not?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a nice suggestion. Added logic to skip UUIDs. I don't think it's worth going beyond that. The overhead of using the interner when the column has high cardinality is very little.

@mapno

This comment was marked as outdated.

a.ptr = addressOfBytes(i.internBytes(v.ByteArray()))
return *(*pq.Value)(unsafe.Pointer(&a))
default:
return *v
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this incur an extra value copy?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but we pass pq.Value as values (🥁) in Entries.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't we cloning values unnecessarily? For any non-byte array/fixed len byte array by cloning here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but values are used everywhere. Changing this to pointers is a big change in the codebase, that I'd prefer to keep out from this PR.

FWIW, v.Clone() is/was creating a copy of pq.Value too. This is unchanged in this PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should the line be v.Clone() to make it consistent with the way it used to be? i'm honestly not sure.

Copy link
Contributor

@mdisibio mdisibio Feb 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For all other types (int, float, etc) the struct doesn't contain external pointers so a copy of the contents is fine. That's what Clone() does: https://github.com/parquet-go/parquet-go/blob/main/value.go#L792 Avoiding it is fine because it would incur another type check unnecessarily.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fine with this leaving as is in the PR, but it does feel safer to call .Clone() in case that internal behavior changes.

pkg/util/intern/intern.go Outdated Show resolved Hide resolved
@mapno mapno changed the title Intern pq.Value Add interning to SyncIterator Feb 22, 2024
@mapno mapno changed the title Add interning to SyncIterator Add string interning to SyncIterator Feb 23, 2024
@mapno mapno marked this pull request as ready for review February 23, 2024 10:06
Copy link
Member

@joe-elliott joe-elliott left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm good on this change. Loving some of the improvements in allocations.

As discussed I would like to see a benchmark that purposefully references a column that is 1) common and 2) high cardinality to confirm there are not regressions in this case.

Great work!

@mapno
Copy link
Member Author

mapno commented Feb 27, 2024

The highest cardinality attribute that I could find was span.http.url, which has up to 14k unique values. This are the benchmarks for that attribute:

Benchmark results
goos: darwin
goarch: arm64
pkg: github.com/grafana/tempo/tempodb/encoding/vparquet3
                                                           │   old.txt   │              new.txt              │
                                                           │   sec/op    │   sec/op     vs base              │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12   359.7m ± 1%   358.0m ± 4%       ~ (p=0.394 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12    1.430 ± 0%    1.447 ± 1%  +1.23% (p=0.004 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12    1.523 ± 0%    1.535 ± 0%  +0.75% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12    1.622 ± 1%    1.637 ± 0%  +0.93% (p=0.004 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12    1.730 ± 0%    1.734 ± 0%       ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12    1.840 ± 0%    1.849 ± 1%  +0.48% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12    1.905 ± 0%    1.925 ± 1%  +1.09% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12    1.934 ± 3%    1.951 ± 0%       ~ (p=0.132 n=6)
geomean                                                       1.402         1.410       +0.64%

                                                           │  old.txt   │              new.txt               │
                                                           │  MB_IO/op  │  MB_IO/op   vs base                │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12   48.54 ± 0%   48.54 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12   46.56 ± 0%   46.56 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                      46.80        46.80       +0.00%
¹ all samples are equal

                                                           │   old.txt   │               new.txt               │
                                                           │  spans/op   │  spans/op    vs base                │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12   366.0k ± 0%   366.0k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12   756.0k ± 0%   756.0k ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12   1.239M ± 0%   1.239M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12   1.803M ± 0%   1.803M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12   2.391M ± 0%   2.391M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12   2.994M ± 0%   2.994M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12   3.374M ± 0%   3.374M ± 0%       ~ (p=1.000 n=6) ¹
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12   3.539M ± 0%   3.539M ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                      1.642M        1.642M       +0.00%
¹ all samples are equal

                                                           │   old.txt   │              new.txt              │
                                                           │   spans/s   │   spans/s    vs base              │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12   1.018M ± 1%   1.022M ± 4%       ~ (p=0.394 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12   528.8k ± 0%   522.3k ± 1%  -1.22% (p=0.004 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12   813.6k ± 0%   807.6k ± 0%  -0.75% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12   1.112M ± 1%   1.102M ± 0%  -0.92% (p=0.004 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12   1.382M ± 0%   1.379M ± 0%       ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12   1.627M ± 0%   1.620M ± 1%  -0.48% (p=0.026 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12   1.771M ± 0%   1.752M ± 1%  -1.07% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12   1.830M ± 3%   1.814M ± 0%       ~ (p=0.132 n=6)
geomean                                                      1.172M        1.164M       -0.63%

                                                           │    old.txt    │               new.txt               │
                                                           │     B/op      │     B/op       vs base              │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12   95.13Mi ±  4%   92.06Mi ±  3%       ~ (p=0.132 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12   229.0Mi ±  9%   221.6Mi ±  6%       ~ (p=0.310 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12   212.2Mi ±  4%   225.4Mi ± 11%  +6.21% (p=0.009 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12   230.3Mi ± 16%   230.5Mi ± 11%       ~ (p=0.699 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12   232.8Mi ± 13%   232.6Mi ±  6%       ~ (p=1.000 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12   223.6Mi ± 12%   230.0Mi ± 14%       ~ (p=0.589 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12   239.2Mi ± 10%   246.5Mi ± 11%       ~ (p=0.937 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12   236.7Mi ± 18%   240.1Mi ±  4%       ~ (p=0.937 n=6)
geomean                                                      205.2Mi         206.9Mi        +0.84%

                                                           │   old.txt    │              new.txt              │
                                                           │  allocs/op   │  allocs/op   vs base              │
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/1-12    429.0k ± 6%   422.5k ± 0%  -1.52% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/2-12    841.5k ± 4%   795.0k ± 4%  -5.53% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/3-12    854.0k ± 4%   814.3k ± 4%  -4.65% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/4-12    917.0k ± 3%   836.7k ± 3%  -8.75% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/5-12    934.5k ± 3%   873.4k ± 3%  -6.54% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/6-12    974.7k ± 2%   911.5k ± 3%  -6.48% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/7-12   1022.1k ± 3%   947.7k ± 3%  -7.28% (p=0.002 n=6)
BackendBlockQueryRange/{}_|_rate()_by_(span.http.url)/8-12   1049.9k ± 9%   977.1k ± 4%  -6.93% (p=0.026 n=6)
geomean                                                       851.5k        800.5k       -5.98%

@joe-elliott
Copy link
Member

nice! lgtm.

@mapno mapno merged commit 1b1bab0 into grafana:main Feb 27, 2024
14 checks passed
@mapno mapno deleted the string-interning branch February 27, 2024 15:54
stoewer added a commit to stoewer/tempo that referenced this pull request Apr 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants