From 01624f5873dc14b0ae047d8afe4a96d8d55b685c Mon Sep 17 00:00:00 2001 From: John Howard Date: Tue, 14 Sep 2021 10:14:30 -0700 Subject: [PATCH] Remove `convTslice` calls in `Record()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is built upon https://github.com/census-instrumentation/opencensus-go/pull/1267; that one should likely merge first. I split this out as it has a small public API change (to work around circular imports) to avoid issues on the first PR. Benchmark relative to #1267: ``` me old time/op new time/op delta Record0-6 1.74ns ± 4% 1.79ns ± 2% +2.85% (p=0.238 n=5+5) Record1-6 634ns ± 6% 542ns ± 9% -14.55% (p=0.008 n=5+5) Record8-6 1.21µs ± 5% 1.23µs ± 2% +1.97% (p=0.254 n=5+5) Record8_WithRecorder-6 777ns ± 5% 792ns ± 5% +1.97% (p=0.421 n=5+5) Record8_Parallel-6 1.26µs ±24% 1.22µs ± 2% ~ (p=0.690 n=5+5) Record8_8Tags-6 1.23µs ± 2% 1.25µs ± 3% ~ (p=0.651 n=5+5) name old alloc/op new alloc/op delta Record0-6 0.00B 0.00B ~ (all equal) Record1-6 120B ± 0% 96B ± 0% -20.00% (p=0.008 n=5+5) Record8-6 344B ± 0% 320B ± 0% -6.98% (p=0.008 n=5+5) Record8_WithRecorder-6 424B ± 0% 424B ± 0% ~ (all equal) Record8_Parallel-6 344B ± 0% 320B ± 0% -6.98% (p=0.008 n=5+5) Record8_8Tags-6 344B ± 0% 320B ± 0% -6.98% (p=0.008 n=5+5) name old allocs/op new allocs/op delta Record0-6 0.00 0.00 ~ (all equal) Record1-6 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) Record8-6 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) Record8_WithRecorder-6 4.00 ± 0% 4.00 ± 0% ~ (all equal) Record8_Parallel-6 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) Record8_8Tags-6 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) ``` --- stats/record.go | 4 +++- stats/view/worker.go | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/stats/record.go b/stats/record.go index f8a52bcd9..00a2afb42 100644 --- a/stats/record.go +++ b/stats/record.go @@ -86,6 +86,8 @@ func createRecordOption(ros ...Options) *recordOptions { return o } +var DefaultRecorder func(tags *tag.Map, measurement []Measurement, attachments map[string]interface{}) + // Record records one or multiple measurements with the same context at once. // If there are any tags in the context, measurements will be tagged with them. func Record(ctx context.Context, ms ...Measurement) { @@ -94,7 +96,7 @@ func Record(ctx context.Context, ms ...Measurement) { if len(ms) == 0 { return } - recorder := internal.DefaultRecorder + recorder := DefaultRecorder record := false for _, m := range ms { if m.desc.subscribed() { diff --git a/stats/view/worker.go b/stats/view/worker.go index 6e8d18b7f..7c8757f12 100644 --- a/stats/view/worker.go +++ b/stats/view/worker.go @@ -33,6 +33,7 @@ func init() { defaultWorker = NewMeter().(*worker) go defaultWorker.start() internal.DefaultRecorder = record + stats.DefaultRecorder = defaultWorker.recordMeasurement } type measureRef struct { @@ -201,9 +202,15 @@ func record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { // Record records a set of measurements ms associated with the given tags and attachments. func (w *worker) Record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { + w.recordMeasurement(tags, ms.([]stats.Measurement), attachments) +} + +// recordMeasurement records a set of measurements ms associated with the given tags and attachments. +// This is the same as Record but without an interface{} type to avoid allocations +func (w *worker) recordMeasurement(tags *tag.Map, ms []stats.Measurement, attachments map[string]interface{}) { req := &recordReq{ tm: tags, - ms: ms.([]stats.Measurement), + ms: ms, attachments: attachments, t: time.Now(), }