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.
This commit is contained in:
Bryan Boreham
2018-07-09 08:14:47 +00:00
parent c91fd6c67b
commit dac008b9c4
2 changed files with 30 additions and 15 deletions

View File

@@ -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++

View File

@@ -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++