opentelemetry-go icon indicating copy to clipboard operation
opentelemetry-go copied to clipboard

Remove Sortable

Open ash2k opened this issue 2 years ago • 5 comments

I wonder what was the reason for introducing the methods with *Sortable in the first place? Code in this PR works fine, but I couldn't find the benchmarks from https://github.com/open-telemetry/opentelemetry-go/pull/3832 to see if it allocates more or is slower. Any pointers?

I ran the existing benchmarks and the results are identical old vs new on both Go 1.20.10 and 1.21.4.

1.20.10, old vs new:

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/attribute
                               │ old_1.20.10.txt │           new_1.20.10.txt           │
                               │     sec/op      │    sec/op     vs base               │
Bool/Value-10                       0.9341n ± 0%   0.9343n ± 0%       ~ (p=0.668 n=10)
Bool/KeyValue-10                     4.639n ± 0%    4.649n ± 0%       ~ (p=0.086 n=10)
Bool/AsBool-10                      0.7567n ± 0%   0.7613n ± 0%  +0.61% (p=0.000 n=10)
Bool/Emit-10                         4.295n ± 0%    4.301n ± 1%       ~ (p=0.171 n=10)
BoolSlice/Value-10                   91.53n ± 0%    91.55n ± 1%       ~ (p=0.517 n=10)
BoolSlice/KeyValue-10                93.11n ± 0%    93.20n ± 0%       ~ (p=0.323 n=10)
BoolSlice/AsBoolSlice-10             94.30n ± 0%    94.58n ± 1%  +0.29% (p=0.009 n=10)
BoolSlice/Emit-10                    293.5n ± 0%    294.7n ± 1%  +0.41% (p=0.002 n=10)
Int/Value-10                        0.9346n ± 0%   0.9339n ± 0%  -0.07% (p=0.024 n=10)
Int/KeyValue-10                      4.636n ± 0%    4.635n ± 0%       ~ (p=0.839 n=10)
Int/Emit-10                          4.983n ± 0%    4.906n ± 1%  -1.55% (p=0.000 n=10)
IntSlice/Value-10                    85.59n ± 0%    85.33n ± 1%       ~ (p=0.119 n=10)
IntSlice/KeyValue-10                 87.71n ± 0%    87.81n ± 0%       ~ (p=0.425 n=10)
IntSlice/Emit-10                     362.1n ± 0%    361.5n ± 0%       ~ (p=0.323 n=10)
Int64/Value-10                      0.9340n ± 0%   0.9336n ± 0%       ~ (p=0.169 n=10)
Int64/KeyValue-10                    4.639n ± 0%    4.649n ± 0%       ~ (p=0.197 n=10)
Int64/AsInt64-10                    0.7554n ± 0%   0.7549n ± 0%       ~ (p=0.270 n=10)
Int64/Emit-10                        5.159n ± 1%    5.271n ± 1%  +2.17% (p=0.002 n=10)
Int64Slice/Value-10                  103.4n ± 1%    103.4n ± 1%       ~ (p=0.838 n=10)
Int64Slice/KeyValue-10               105.0n ± 1%    104.8n ± 1%       ~ (p=0.283 n=10)
Int64Slice/AsInt64Slice-10           99.58n ± 0%    99.59n ± 0%       ~ (p=0.839 n=10)
Int64Slice/Emit-10                   361.4n ± 0%    361.5n ± 1%       ~ (p=0.342 n=10)
Float64/Value-10                    0.9353n ± 0%   0.9353n ± 0%       ~ (p=0.985 n=10)
Float64/KeyValue-10                  4.639n ± 0%    4.648n ± 0%       ~ (p=0.147 n=10)
Float64/AsFloat64-10                0.7501n ± 0%   0.7501n ± 0%       ~ (p=0.515 n=10)
Float64/Emit-10                      75.85n ± 1%    75.70n ± 0%       ~ (p=0.148 n=10)
Float64Slice/Value-10                105.5n ± 1%    105.4n ± 0%       ~ (p=0.838 n=10)
Float64Slice/KeyValue-10             106.8n ± 0%    106.8n ± 1%       ~ (p=0.845 n=10)
Float64Slice/AsFloat64Slice-10       101.7n ± 0%    101.6n ± 0%       ~ (p=0.354 n=10)
Float64Slice/Emit-10                 440.7n ± 1%    440.7n ± 0%       ~ (p=0.895 n=10)
String/Value-10                      1.247n ± 0%    1.248n ± 0%       ~ (p=0.088 n=10)
String/KeyValue-10                   4.614n ± 0%    4.609n ± 0%  -0.11% (p=0.003 n=10)
String/AsString-10                   1.075n ± 0%    1.070n ± 0%  -0.42% (p=0.000 n=10)
String/Emit-10                       3.248n ± 0%    3.241n ± 0%  -0.23% (p=0.012 n=10)
StringSlice/Value-10                 120.8n ± 0%    121.2n ± 0%       ~ (p=0.115 n=10)
StringSlice/KeyValue-10              122.3n ± 0%    122.9n ± 1%  +0.45% (p=0.015 n=10)
StringSlice/AsStringSlice-10         109.3n ± 0%    109.5n ± 0%       ~ (p=0.951 n=10)
StringSlice/Emit-10                  371.1n ± 1%    370.1n ± 0%  -0.27% (p=0.017 n=10)
geomean                              18.65n         18.66n       +0.04%

                               │ old_1.20.10.txt │           new_1.20.10.txt           │
                               │      B/op       │    B/op     vs base                 │
Bool/Value-10                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/KeyValue-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/AsBool-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/Emit-10                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/Value-10                  30.00 ± 0%     30.00 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/KeyValue-10               30.00 ± 0%     30.00 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/AsBoolSlice-10            27.00 ± 0%     27.00 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/Emit-10                   78.00 ± 0%     78.00 ± 0%       ~ (p=1.000 n=10) ¹
Int/Value-10                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int/KeyValue-10                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int/Emit-10                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/Value-10                   48.00 ± 0%     48.00 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/KeyValue-10                48.00 ± 0%     48.00 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/Emit-10                    112.0 ± 0%     112.0 ± 0%       ~ (p=1.000 n=10) ¹
Int64/Value-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/KeyValue-10                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/AsInt64-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/Emit-10                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/Value-10                 72.00 ± 0%     72.00 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/KeyValue-10              72.00 ± 0%     72.00 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/AsInt64Slice-10          48.00 ± 0%     48.00 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/Emit-10                  112.0 ± 0%     112.0 ± 0%       ~ (p=1.000 n=10) ¹
Float64/Value-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/KeyValue-10                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/AsFloat64-10                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/Emit-10                     16.00 ± 0%     16.00 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/Value-10               72.00 ± 0%     72.00 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/KeyValue-10            72.00 ± 0%     72.00 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/AsFloat64Slice-10      48.00 ± 0%     48.00 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/Emit-10                112.0 ± 0%     112.0 ± 0%       ~ (p=1.000 n=10) ¹
String/Value-10                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/KeyValue-10                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/AsString-10                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/Emit-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/Value-10                120.0 ± 0%     120.0 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/KeyValue-10             120.0 ± 0%     120.0 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/AsStringSlice-10        72.00 ± 0%     72.00 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/Emit-10                 192.0 ± 0%     192.0 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                        ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                               │ old_1.20.10.txt │           new_1.20.10.txt           │
                               │    allocs/op    │ allocs/op   vs base                 │
Bool/Value-10                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/KeyValue-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/AsBool-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Bool/Emit-10                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/Value-10                  3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/KeyValue-10               3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/AsBoolSlice-10            2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
BoolSlice/Emit-10                   7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=10) ¹
Int/Value-10                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int/KeyValue-10                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int/Emit-10                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/Value-10                   2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/KeyValue-10                2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
IntSlice/Emit-10                    7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/Value-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/KeyValue-10                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/AsInt64-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64/Emit-10                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/Value-10                 3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/KeyValue-10              3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/AsInt64Slice-10          2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
Int64Slice/Emit-10                  7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/Value-10                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/KeyValue-10                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/AsFloat64-10                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64/Emit-10                     2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/Value-10               3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/KeyValue-10            3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/AsFloat64Slice-10      2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
Float64Slice/Emit-10                7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=10) ¹
String/Value-10                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/KeyValue-10                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/AsString-10                  0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
String/Emit-10                      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/Value-10                3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/KeyValue-10             3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/AsStringSlice-10        2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10) ¹
StringSlice/Emit-10                 7.000 ± 0%     7.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                        ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

1.21.4, old vs new:

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/attribute
                               │ old_1.21.4.txt │            new_1.21.4.txt             │
                               │     sec/op     │    sec/op      vs base                │
Bool/Value-10                      1.245n ± ∞ ¹    1.245n ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/KeyValue-10                   4.652n ± ∞ ¹    4.650n ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/AsBool-10                    0.7224n ± ∞ ¹   0.7514n ± ∞ ¹       ~ (p=0.100 n=3) ²
Bool/Emit-10                       4.297n ± ∞ ¹    4.329n ± ∞ ¹       ~ (p=0.100 n=3) ²
BoolSlice/Value-10                 89.94n ± ∞ ¹    89.70n ± ∞ ¹       ~ (p=0.400 n=3) ²
BoolSlice/KeyValue-10              91.09n ± ∞ ¹    90.40n ± ∞ ¹       ~ (p=0.200 n=3) ²
BoolSlice/AsBoolSlice-10           92.45n ± ∞ ¹    91.50n ± ∞ ¹       ~ (p=0.100 n=3) ²
BoolSlice/Emit-10                  299.2n ± ∞ ¹    295.1n ± ∞ ¹       ~ (p=0.100 n=3) ²
Int/Value-10                       1.245n ± ∞ ¹    1.245n ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/KeyValue-10                    4.651n ± ∞ ¹    4.661n ± ∞ ¹       ~ (p=0.600 n=3) ²
Int/Emit-10                        5.295n ± ∞ ¹    5.044n ± ∞ ¹       ~ (p=0.700 n=3) ²
IntSlice/Value-10                  82.25n ± ∞ ¹    82.45n ± ∞ ¹       ~ (p=0.700 n=3) ²
IntSlice/KeyValue-10               85.25n ± ∞ ¹    85.34n ± ∞ ¹       ~ (p=0.100 n=3) ²
IntSlice/Emit-10                   347.9n ± ∞ ¹    347.3n ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/Value-10                     1.245n ± ∞ ¹    1.246n ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/KeyValue-10                  4.647n ± ∞ ¹    4.641n ± ∞ ¹       ~ (p=0.700 n=3) ²
Int64/AsInt64-10                  0.7051n ± ∞ ¹   0.7507n ± ∞ ¹       ~ (p=0.100 n=3) ²
Int64/Emit-10                      4.933n ± ∞ ¹    5.210n ± ∞ ¹       ~ (p=0.100 n=3) ²
Int64Slice/Value-10                100.9n ± ∞ ¹    100.4n ± ∞ ¹       ~ (p=0.100 n=3) ²
Int64Slice/KeyValue-10             103.0n ± ∞ ¹    101.8n ± ∞ ¹       ~ (p=0.100 n=3) ²
Int64Slice/AsInt64Slice-10         97.17n ± ∞ ¹    97.35n ± ∞ ¹       ~ (p=0.800 n=3) ²
Int64Slice/Emit-10                 351.4n ± ∞ ¹    348.0n ± ∞ ¹       ~ (p=0.200 n=3) ²
Float64/Value-10                   1.244n ± ∞ ¹    1.245n ± ∞ ¹       ~ (p=0.400 n=3) ²
Float64/KeyValue-10                4.651n ± ∞ ¹    4.655n ± ∞ ¹       ~ (p=0.400 n=3) ²
Float64/AsFloat64-10              0.7055n ± ∞ ¹   0.7510n ± ∞ ¹       ~ (p=0.100 n=3) ²
Float64/Emit-10                    75.97n ± ∞ ¹    76.66n ± ∞ ¹       ~ (p=0.100 n=3) ²
Float64Slice/Value-10              101.9n ± ∞ ¹    102.1n ± ∞ ¹       ~ (p=0.400 n=3) ²
Float64Slice/KeyValue-10           104.0n ± ∞ ¹    103.6n ± ∞ ¹       ~ (p=0.100 n=3) ²
Float64Slice/AsFloat64Slice-10     98.74n ± ∞ ¹    98.65n ± ∞ ¹       ~ (p=0.700 n=3) ²
Float64Slice/Emit-10               436.2n ± ∞ ¹    436.9n ± ∞ ¹       ~ (p=1.000 n=3) ²
String/Value-10                    1.713n ± ∞ ¹    1.713n ± ∞ ¹       ~ (p=0.800 n=3) ²
String/KeyValue-10                 4.649n ± ∞ ¹    4.650n ± ∞ ¹       ~ (p=0.900 n=3) ²
String/AsString-10                0.9805n ± ∞ ¹   1.0600n ± ∞ ¹       ~ (p=0.100 n=3) ²
String/Emit-10                     3.266n ± ∞ ¹    3.242n ± ∞ ¹       ~ (p=0.100 n=3) ²
StringSlice/Value-10               118.3n ± ∞ ¹    118.6n ± ∞ ¹       ~ (p=0.500 n=3) ²
StringSlice/KeyValue-10            120.7n ± ∞ ¹    120.5n ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/AsStringSlice-10       107.2n ± ∞ ¹    107.0n ± ∞ ¹       ~ (p=0.500 n=3) ²
StringSlice/Emit-10                363.3n ± ∞ ¹    356.9n ± ∞ ¹       ~ (p=0.100 n=3) ²
geomean                            19.05n          19.15n        +0.48%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                               │ old_1.21.4.txt │           new_1.21.4.txt            │
                               │      B/op      │    B/op      vs base                │
Bool/Value-10                       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/KeyValue-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/AsBool-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/Emit-10                        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/Value-10                  30.00 ± ∞ ¹   30.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/KeyValue-10               30.00 ± ∞ ¹   30.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/AsBoolSlice-10            27.00 ± ∞ ¹   27.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/Emit-10                   78.00 ± ∞ ¹   78.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/Value-10                        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/KeyValue-10                     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/Emit-10                         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/Value-10                   48.00 ± ∞ ¹   48.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/KeyValue-10                48.00 ± ∞ ¹   48.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/Emit-10                    112.0 ± ∞ ¹   112.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/Value-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/KeyValue-10                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/AsInt64-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/Emit-10                       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/Value-10                 72.00 ± ∞ ¹   72.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/KeyValue-10              72.00 ± ∞ ¹   72.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/AsInt64Slice-10          48.00 ± ∞ ¹   48.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/Emit-10                  112.0 ± ∞ ¹   112.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/Value-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/KeyValue-10                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/AsFloat64-10                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/Emit-10                     16.00 ± ∞ ¹   16.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/Value-10               72.00 ± ∞ ¹   72.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/KeyValue-10            72.00 ± ∞ ¹   72.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/AsFloat64Slice-10      48.00 ± ∞ ¹   48.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/Emit-10                112.0 ± ∞ ¹   112.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/Value-10                     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/KeyValue-10                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/AsString-10                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/Emit-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/Value-10                120.0 ± ∞ ¹   120.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/KeyValue-10             120.0 ± ∞ ¹   120.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/AsStringSlice-10        72.00 ± ∞ ¹   72.00 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/Emit-10                 192.0 ± ∞ ¹   192.0 ± ∞ ¹       ~ (p=1.000 n=3) ²
geomean                                       ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

                               │ old_1.21.4.txt │           new_1.21.4.txt            │
                               │   allocs/op    │  allocs/op   vs base                │
Bool/Value-10                       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/KeyValue-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/AsBool-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Bool/Emit-10                        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/Value-10                  3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/KeyValue-10               3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/AsBoolSlice-10            2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
BoolSlice/Emit-10                   7.000 ± ∞ ¹   7.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/Value-10                        0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/KeyValue-10                     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int/Emit-10                         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/Value-10                   2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/KeyValue-10                2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
IntSlice/Emit-10                    7.000 ± ∞ ¹   7.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/Value-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/KeyValue-10                   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/AsInt64-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64/Emit-10                       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/Value-10                 3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/KeyValue-10              3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/AsInt64Slice-10          2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Int64Slice/Emit-10                  7.000 ± ∞ ¹   7.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/Value-10                    0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/KeyValue-10                 0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/AsFloat64-10                0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64/Emit-10                     2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/Value-10               3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/KeyValue-10            3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/AsFloat64Slice-10      2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
Float64Slice/Emit-10                7.000 ± ∞ ¹   7.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/Value-10                     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/KeyValue-10                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/AsString-10                  0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
String/Emit-10                      0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/Value-10                3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/KeyValue-10             3.000 ± ∞ ¹   3.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/AsStringSlice-10        2.000 ± ∞ ¹   2.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
StringSlice/Emit-10                 7.000 ± ∞ ¹   7.000 ± ∞ ¹       ~ (p=1.000 n=3) ²
geomean                                       ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

New code, 1.20.10 vs 1.21.4:

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/attribute
                               │ new_1.20.10.txt │             new_1.21.4.txt              │
                               │     sec/op      │    sec/op      vs base                  │
Bool/Value-10                       0.9343n ± 0%   1.2450n ± ∞ ¹  +33.26% (p=0.007 n=10+3)
Bool/KeyValue-10                     4.649n ± 0%    4.650n ± ∞ ¹        ~ (p=0.573 n=10+3)
Bool/AsBool-10                      0.7613n ± 0%   0.7514n ± ∞ ¹   -1.30% (p=0.007 n=10+3)
Bool/Emit-10                         4.301n ± 1%    4.329n ± ∞ ¹        ~ (p=0.077 n=10+3)
BoolSlice/Value-10                   91.55n ± 1%    89.70n ± ∞ ¹   -2.02% (p=0.007 n=10+3)
BoolSlice/KeyValue-10                93.20n ± 0%    90.40n ± ∞ ¹   -3.00% (p=0.007 n=10+3)
BoolSlice/AsBoolSlice-10             94.58n ± 1%    91.50n ± ∞ ¹   -3.25% (p=0.007 n=10+3)
BoolSlice/Emit-10                    294.7n ± 1%    295.1n ± ∞ ¹        ~ (p=0.315 n=10+3)
Int/Value-10                        0.9339n ± 0%   1.2450n ± ∞ ¹  +33.31% (p=0.007 n=10+3)
Int/KeyValue-10                      4.635n ± 0%    4.661n ± ∞ ¹   +0.57% (p=0.021 n=10+3)
Int/Emit-10                          4.906n ± 1%    5.044n ± ∞ ¹   +2.80% (p=0.007 n=10+3)
IntSlice/Value-10                    85.33n ± 1%    82.45n ± ∞ ¹   -3.38% (p=0.007 n=10+3)
IntSlice/KeyValue-10                 87.81n ± 0%    85.34n ± ∞ ¹   -2.82% (p=0.007 n=10+3)
IntSlice/Emit-10                     361.5n ± 0%    347.3n ± ∞ ¹   -3.93% (p=0.007 n=10+3)
Int64/Value-10                      0.9336n ± 0%   1.2460n ± ∞ ¹  +33.45% (p=0.007 n=10+3)
Int64/KeyValue-10                    4.649n ± 0%    4.641n ± ∞ ¹        ~ (p=0.811 n=10+3)
Int64/AsInt64-10                    0.7549n ± 0%   0.7507n ± ∞ ¹   -0.55% (p=0.007 n=10+3)
Int64/Emit-10                        5.271n ± 1%    5.210n ± ∞ ¹        ~ (p=0.371 n=10+3)
Int64Slice/Value-10                  103.4n ± 1%    100.4n ± ∞ ¹   -2.90% (p=0.007 n=10+3)
Int64Slice/KeyValue-10               104.8n ± 1%    101.8n ± ∞ ¹   -2.91% (p=0.007 n=10+3)
Int64Slice/AsInt64Slice-10           99.59n ± 0%    97.35n ± ∞ ¹   -2.25% (p=0.007 n=10+3)
Int64Slice/Emit-10                   361.5n ± 1%    348.0n ± ∞ ¹   -3.73% (p=0.007 n=10+3)
Float64/Value-10                    0.9353n ± 0%   1.2450n ± ∞ ¹  +33.12% (p=0.007 n=10+3)
Float64/KeyValue-10                  4.648n ± 0%    4.655n ± ∞ ¹        ~ (p=0.077 n=10+3)
Float64/AsFloat64-10                0.7501n ± 0%   0.7510n ± ∞ ¹        ~ (p=0.168 n=10+3)
Float64/Emit-10                      75.70n ± 0%    76.66n ± ∞ ¹   +1.26% (p=0.007 n=10+3)
Float64Slice/Value-10                105.4n ± 0%    102.1n ± ∞ ¹   -3.13% (n=10+3)
Float64Slice/KeyValue-10             106.8n ± 1%    103.6n ± ∞ ¹   -3.00% (p=0.007 n=10+3)
Float64Slice/AsFloat64Slice-10      101.60n ± 0%    98.65n ± ∞ ¹   -2.90% (n=10+3)
Float64Slice/Emit-10                 440.7n ± 0%    436.9n ± ∞ ¹   -0.85% (n=10+3)
String/Value-10                      1.248n ± 0%    1.713n ± ∞ ¹  +37.31% (p=0.007 n=10+3)
String/KeyValue-10                   4.609n ± 0%    4.650n ± ∞ ¹   +0.88% (p=0.007 n=10+3)
String/AsString-10                   1.070n ± 0%    1.060n ± ∞ ¹   -0.93% (n=10+3)
String/Emit-10                       3.241n ± 0%    3.242n ± ∞ ¹        ~ (p=0.713 n=10+3)
StringSlice/Value-10                 121.2n ± 0%    118.6n ± ∞ ¹   -2.15% (p=0.007 n=10+3)
StringSlice/KeyValue-10              122.9n ± 1%    120.5n ± ∞ ¹   -1.91% (p=0.007 n=10+3)
StringSlice/AsStringSlice-10         109.5n ± 0%    107.0n ± ∞ ¹   -2.24% (n=10+3)
StringSlice/Emit-10                  370.1n ± 0%    356.9n ± ∞ ¹   -3.57% (p=0.007 n=10+3)
geomean                              18.66n         19.15n         +2.62%
¹ need >= 6 samples for confidence interval at level 0.95

                               │ new_1.20.10.txt │             new_1.21.4.txt             │
                               │      B/op       │    B/op      vs base                   │
Bool/Value-10                       0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/KeyValue-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/AsBool-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/Emit-10                        0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/Value-10                  30.00 ± 0%     30.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/KeyValue-10               30.00 ± 0%     30.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/AsBoolSlice-10            27.00 ± 0%     27.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/Emit-10                   78.00 ± 0%     78.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/Value-10                        0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/KeyValue-10                     0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/Emit-10                         0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/Value-10                   48.00 ± 0%     48.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/KeyValue-10                48.00 ± 0%     48.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/Emit-10                    112.0 ± 0%     112.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/Value-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/KeyValue-10                   0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/AsInt64-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/Emit-10                       0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/Value-10                 72.00 ± 0%     72.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/KeyValue-10              72.00 ± 0%     72.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/AsInt64Slice-10          48.00 ± 0%     48.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/Emit-10                  112.0 ± 0%     112.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/Value-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/KeyValue-10                 0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/AsFloat64-10                0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/Emit-10                     16.00 ± 0%     16.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/Value-10               72.00 ± 0%     72.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/KeyValue-10            72.00 ± 0%     72.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/AsFloat64Slice-10      48.00 ± 0%     48.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/Emit-10                112.0 ± 0%     112.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/Value-10                     0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/KeyValue-10                  0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/AsString-10                  0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/Emit-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/Value-10                120.0 ± 0%     120.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/KeyValue-10             120.0 ± 0%     120.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/AsStringSlice-10        72.00 ± 0%     72.00 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/Emit-10                 192.0 ± 0%     192.0 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
geomean                                        ³                +0.00%                  ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

                               │ new_1.20.10.txt │             new_1.21.4.txt             │
                               │    allocs/op    │  allocs/op   vs base                   │
Bool/Value-10                       0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/KeyValue-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/AsBool-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Bool/Emit-10                        0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/Value-10                  3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/KeyValue-10               3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/AsBoolSlice-10            2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
BoolSlice/Emit-10                   7.000 ± 0%     7.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/Value-10                        0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/KeyValue-10                     0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int/Emit-10                         0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/Value-10                   2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/KeyValue-10                2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
IntSlice/Emit-10                    7.000 ± 0%     7.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/Value-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/KeyValue-10                   0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/AsInt64-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64/Emit-10                       0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/Value-10                 3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/KeyValue-10              3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/AsInt64Slice-10          2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Int64Slice/Emit-10                  7.000 ± 0%     7.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/Value-10                    0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/KeyValue-10                 0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/AsFloat64-10                0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64/Emit-10                     2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/Value-10               3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/KeyValue-10            3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/AsFloat64Slice-10      2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
Float64Slice/Emit-10                7.000 ± 0%     7.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/Value-10                     0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/KeyValue-10                  0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/AsString-10                  0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
String/Emit-10                      0.000 ± 0%     0.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/Value-10                3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/KeyValue-10             3.000 ± 0%     3.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/AsStringSlice-10        2.000 ± 0%     2.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
StringSlice/Emit-10                 7.000 ± 0%     7.000 ± ∞ ¹       ~ (p=1.000 n=10+3) ²
geomean                                        ³                +0.00%                  ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

There are some performance differences (not allocations though), but I only ran count=3 for the 1.21 version as I'm short on time today. I'll re-run that tomorrow with count=10 to improve accuracy.

ash2k avatar Nov 30 '23 11:11 ash2k

Codecov Report

Attention: Patch coverage is 50.00000% with 4 lines in your changes are missing coverage. Please review.

Project coverage is 83.4%. Comparing base (2d968c4) to head (fd2da8a).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##            main   #4734     +/-   ##
=======================================
- Coverage   83.5%   83.4%   -0.1%     
=======================================
  Files        238     238             
  Lines      15757   15745     -12     
=======================================
- Hits       13159   13143     -16     
- Misses      2309    2314      +5     
+ Partials     289     288      -1     
Files Coverage Δ
attribute/set.go 74.5% <50.0%> (-3.8%) :arrow_down:

codecov[bot] avatar Nov 30 '23 11:11 codecov[bot]

CC @MrAlias

pellared avatar Dec 06 '23 12:12 pellared

I've added a new benchmark that exercises the NewSetWithSortableFiltered() function directly. Here are the results:

main:
BenchmarkNewSetWithSortableFiltered-10    	 8248227	       138.4 ns/op	     448 B/op	       1 allocs/op

branch:
BenchmarkNewSetWithSortableFiltered-10    	 6625119	       177.0 ns/op	     448 B/op	       1 allocs/op

Because we are testing sorting, actual performance depends on the data being sorted. But this branch performs 1 allocation too.

ash2k avatar Dec 11 '23 02:12 ash2k

$ go1.20 version
go version go1.20 linux/amd64

$ go1.20 test -run='^$' -bench=NewSetWithSortableFiltered
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/attribute
cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
BenchmarkNewSetWithSortableFiltered-8   	 2496835	       480.1 ns/op	     584 B/op	       4 allocs/op
PASS

On main:

$ go1.20 test -run='^$' -bench=NewSetWithSortableFiltered
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/attribute
cpu: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
BenchmarkNewSetWithSortableFiltered-8   	 4108585	       283.9 ns/op	     448 B/op	       1 allocs/op
PASS

MrAlias avatar Jan 03 '24 17:01 MrAlias

On branch:

$ go version
go version go1.21.4 linux/amd64

$ go test -run=^$ -bench=NewSetWithSortableFiltered
goos: linux
goarch: amd64
pkg: go.opentelemetry.io/otel/attribute
cpu: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz
BenchmarkNewSetWithSortableFiltered-16           5002983               239.6 ns/op           448 B/op          1 allocs/op
PASS
ok      go.opentelemetry.io/otel/attribute      1.448s

I think we can consider this PR when we drop support for Go 1.20.

pellared avatar Jan 25 '24 22:01 pellared

This should be ready to merge now that https://github.com/open-telemetry/opentelemetry-go/pull/4967 is merged.

Please update to remove the separate code paths for versions of Go less than 1.21 as they are no longer supported.

MrAlias avatar Feb 28 '24 16:02 MrAlias

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/attribute
Go: 1.21.8

New code:

BenchmarkFiltering
BenchmarkFiltering/NoFilter
BenchmarkFiltering/NoFilter/Set.Filter
BenchmarkFiltering/NoFilter/Set.Filter-10         	571478235	         2.061 ns/op	       0 B/op	       0 allocs/op
BenchmarkFiltering/NoFilter/NewSetWithFiltered
BenchmarkFiltering/NoFilter/NewSetWithFiltered-10 	 1000000	      1087 ns/op	    3584 B/op	       2 allocs/op
BenchmarkFiltering/NoFiltered
BenchmarkFiltering/NoFiltered/Set.Filter
BenchmarkFiltering/NoFiltered/Set.Filter-10       	 3128260	       382.1 ns/op	       0 B/op	       0 allocs/op
BenchmarkFiltering/NoFiltered/NewSetWithFiltered
BenchmarkFiltering/NoFiltered/NewSetWithFiltered-10         	  967354	      1264 ns/op	    3584 B/op	       2 allocs/op
BenchmarkFiltering/Filtered
BenchmarkFiltering/Filtered/Set.Filter
BenchmarkFiltering/Filtered/Set.Filter-10                   	 1326331	       870.4 ns/op	    1856 B/op	       2 allocs/op
BenchmarkFiltering/Filtered/NewSetWithFiltered
BenchmarkFiltering/Filtered/NewSetWithFiltered-10           	 1217002	       985.0 ns/op	      64 B/op	       1 allocs/op
BenchmarkFiltering/AllDropped
BenchmarkFiltering/AllDropped/Set.Filter
BenchmarkFiltering/AllDropped/Set.Filter-10                 	 1418766	       844.3 ns/op	    1792 B/op	       1 allocs/op
BenchmarkFiltering/AllDropped/NewSetWithFiltered
BenchmarkFiltering/AllDropped/NewSetWithFiltered-10         	 2279227	       525.0 ns/op	       0 B/op	       0 allocs/op

Old code:

BenchmarkFiltering
BenchmarkFiltering/NoFilter
BenchmarkFiltering/NoFilter/Set.Filter
BenchmarkFiltering/NoFilter/Set.Filter-10         	556945123	         2.053 ns/op	       0 B/op	       0 allocs/op
BenchmarkFiltering/NoFilter/NewSetWithFiltered
BenchmarkFiltering/NoFilter/NewSetWithFiltered-10 	 1274888	       943.1 ns/op	    3585 B/op	       2 allocs/op
BenchmarkFiltering/NoFiltered
BenchmarkFiltering/NoFiltered/Set.Filter
BenchmarkFiltering/NoFiltered/Set.Filter-10       	 3141591	       381.9 ns/op	       0 B/op	       0 allocs/op
BenchmarkFiltering/NoFiltered/NewSetWithFiltered
BenchmarkFiltering/NoFiltered/NewSetWithFiltered-10         	 1000000	      1106 ns/op	    3585 B/op	       2 allocs/op
BenchmarkFiltering/Filtered
BenchmarkFiltering/Filtered/Set.Filter
BenchmarkFiltering/Filtered/Set.Filter-10                   	 1377650	       865.5 ns/op	    1856 B/op	       2 allocs/op
BenchmarkFiltering/Filtered/NewSetWithFiltered
BenchmarkFiltering/Filtered/NewSetWithFiltered-10           	 1629787	       733.1 ns/op	      64 B/op	       1 allocs/op
BenchmarkFiltering/AllDropped
BenchmarkFiltering/AllDropped/Set.Filter
BenchmarkFiltering/AllDropped/Set.Filter-10                 	 1416115	       844.3 ns/op	    1792 B/op	       1 allocs/op
BenchmarkFiltering/AllDropped/NewSetWithFiltered
BenchmarkFiltering/AllDropped/NewSetWithFiltered-10         	 3032091	       388.7 ns/op	       0 B/op	       0 allocs/op

ash2k avatar Mar 06 '24 09:03 ash2k

@MrAlias Added back the benchmark.

ash2k avatar Mar 07 '24 22:03 ash2k