From dac008b9c42e133f6902997d37534e770c27680d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 9 Jul 2018 08:14:47 +0000 Subject: [PATCH] Early return from LatestMap merge loop If we run out of things to look at in the other map, return quickly. Also move the equal-key case above the less-than case, since maps with equal keys are the common case when merging. --- extras/generate_latest_map | 15 ++++++++++----- report/latest_map_generated.go | 30 ++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/extras/generate_latest_map b/extras/generate_latest_map index 0f831799c..3ae35b398 100755 --- a/extras/generate_latest_map +++ b/extras/generate_latest_map @@ -96,14 +96,16 @@ function generate_latest_map() { loop: for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - i++ + case j >= len(n): + return m case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { break loop } i++ j++ + case m[i].key < n[j].key: + i++ default: break loop } @@ -117,9 +119,9 @@ function generate_latest_map() { for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - out = append(out, m[i]) - i++ + case j >= len(n): + out = append(out, m[i:]...) + return out case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { out = append(out, n[j]) @@ -128,6 +130,9 @@ function generate_latest_map() { } i++ j++ + case m[i].key < n[j].key: + out = append(out, m[i]) + i++ default: out = append(out, n[j]) j++ diff --git a/report/latest_map_generated.go b/report/latest_map_generated.go index 626b80988..97ce72382 100644 --- a/report/latest_map_generated.go +++ b/report/latest_map_generated.go @@ -64,14 +64,16 @@ func (m StringLatestMap) Merge(n StringLatestMap) StringLatestMap { loop: for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - i++ + case j >= len(n): + return m case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { break loop } i++ j++ + case m[i].key < n[j].key: + i++ default: break loop } @@ -85,9 +87,9 @@ loop: for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - out = append(out, m[i]) - i++ + case j >= len(n): + out = append(out, m[i:]...) + return out case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { out = append(out, n[j]) @@ -96,6 +98,9 @@ loop: } i++ j++ + case m[i].key < n[j].key: + out = append(out, m[i]) + i++ default: out = append(out, n[j]) j++ @@ -311,14 +316,16 @@ func (m NodeControlDataLatestMap) Merge(n NodeControlDataLatestMap) NodeControlD loop: for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - i++ + case j >= len(n): + return m case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { break loop } i++ j++ + case m[i].key < n[j].key: + i++ default: break loop } @@ -332,9 +339,9 @@ loop: for i < len(m) { switch { - case j >= len(n) || m[i].key < n[j].key: - out = append(out, m[i]) - i++ + case j >= len(n): + out = append(out, m[i:]...) + return out case m[i].key == n[j].key: if m[i].Timestamp.Before(n[j].Timestamp) { out = append(out, n[j]) @@ -343,6 +350,9 @@ loop: } i++ j++ + case m[i].key < n[j].key: + out = append(out, m[i]) + i++ default: out = append(out, n[j]) j++