Skip to content

Commit 63cb525

Browse files
authored
optimize 'getFullResult' (#504)
1 parent a0b6f3a commit 63cb525

File tree

2 files changed

+89
-16
lines changed

2 files changed

+89
-16
lines changed

scheduler/complex/cpu_test.go

+24-2
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,33 @@ func TestGetFullResult(t *testing.T) {
253253
pieces: 400,
254254
},
255255
})
256-
assert.EqualValues(t, 4, len(res))
256+
assert.EqualValues(t, 5, len(res))
257257
assert.ElementsMatch(t, res, []types.ResourceMap{
258258
{"0": 100, "1": 100},
259-
{"0": 100, "1": 100},
260259
{"0": 100, "2": 100},
261260
{"0": 100, "2": 100},
261+
{"0": 100, "2": 100},
262+
{"1": 100, "2": 100},
263+
})
264+
265+
res = h.getFullResult(2, []resourceInfo{
266+
{
267+
id: "0",
268+
pieces: 200,
269+
},
270+
{
271+
id: "1",
272+
pieces: 200,
273+
},
274+
{
275+
id: "2",
276+
pieces: 200,
277+
},
278+
})
279+
assert.EqualValues(t, 3, len(res))
280+
assert.ElementsMatch(t, res, []types.ResourceMap{
281+
{"0": 100, "1": 100},
282+
{"0": 100, "2": 100},
283+
{"1": 100, "2": 100},
262284
})
263285
}

scheduler/complex/resource.go

+65-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package complexscheduler
22

33
import (
4+
"container/heap"
45
"sort"
56

67
"github.com/projecteru2/core/types"
@@ -11,6 +12,37 @@ type resourceInfo struct {
1112
pieces int64
1213
}
1314

15+
type resourceInfoHeap []resourceInfo
16+
17+
// Len .
18+
func (r resourceInfoHeap) Len() int {
19+
return len(r)
20+
}
21+
22+
// Less .
23+
func (r resourceInfoHeap) Less(i, j int) bool {
24+
return r[i].pieces > r[j].pieces
25+
}
26+
27+
// Swap .
28+
func (r resourceInfoHeap) Swap(i, j int) {
29+
r[i], r[j] = r[j], r[i]
30+
}
31+
32+
// Push .
33+
func (r *resourceInfoHeap) Push(x interface{}) {
34+
*r = append(*r, x.(resourceInfo))
35+
}
36+
37+
// Pop .
38+
func (r *resourceInfoHeap) Pop() interface{} {
39+
old := *r
40+
n := len(old)
41+
x := old[n-1]
42+
*r = old[:n-1]
43+
return x
44+
}
45+
1446
type host struct {
1547
full []resourceInfo
1648
fragment []resourceInfo
@@ -183,26 +215,45 @@ func (h *host) getFragmentsResult(resources []resourceInfo, fragments ...int64)
183215

184216
func (h *host) getFullResult(full int, resources []resourceInfo) []types.ResourceMap {
185217
result := []types.ResourceMap{}
218+
resourceHeap := &resourceInfoHeap{}
219+
indexMap := map[string]int{}
220+
for i, resource := range resources {
221+
indexMap[resource.id] = i
222+
resourceHeap.Push(resourceInfo{id: resource.id, pieces: resource.pieces})
223+
}
224+
heap.Init(resourceHeap)
186225

187-
for len(resources)/full > 0 {
188-
count, rem := len(resources)/full, len(resources)%full
189-
newResources := []resourceInfo{}
190-
for i := 0; i < count; i++ {
191-
plan := types.ResourceMap{}
192-
for j := i * full; j < i*full+full; j++ {
193-
// 洗掉没配额的
194-
last := resources[j].pieces - int64(h.share)
195-
if last > 0 {
196-
newResources = append(newResources, resourceInfo{resources[j].id, last})
197-
}
198-
plan[resources[j].id] = int64(h.share)
226+
for resourceHeap.Len() >= full {
227+
plan := types.ResourceMap{}
228+
resourcesToPush := []resourceInfo{}
229+
230+
for i := 0; i < full; i++ {
231+
resource := heap.Pop(resourceHeap).(resourceInfo)
232+
plan[resource.id] = int64(h.share)
233+
234+
resource.pieces -= int64(h.share)
235+
if resource.pieces > 0 {
236+
resourcesToPush = append(resourcesToPush, resource)
199237
}
200-
result = append(result, plan)
201238
}
202239

203-
resources = append(newResources, resources[len(resources)-rem:]...)
240+
result = append(result, plan)
241+
for _, resource := range resourcesToPush {
242+
heap.Push(resourceHeap, resource)
243+
}
204244
}
205245

246+
// Try to ensure the effectiveness of the previous priority
247+
sumOfIds := func(r types.ResourceMap) int {
248+
sum := 0
249+
for id := range r {
250+
sum += indexMap[id]
251+
}
252+
return sum
253+
}
254+
255+
sort.Slice(result, func(i, j int) bool { return sumOfIds(result[i]) < sumOfIds(result[j]) })
256+
206257
return result
207258
}
208259

0 commit comments

Comments
 (0)