package main
import (
"container/heap"
"fmt"
"math/rand"
"time"
)
const n = 100_000
type tuple struct {
k1 int
k2 int
k3 int
k4 int
}
type Task struct {
keys tuple
key int
taskID int
userID int
}
func NewTask(k1, k2, k3, k4 int, taskID, userID int) Task {
key := k1 + k2 + k3 + k4
return Task{tuple{k1, k2, k3, k4}, key, taskID, userID}
}
type TaskHeap []Task
func (h TaskHeap) Len() int { return len(h) }
func (h TaskHeap) Less(i, j int) bool { return h[i].key < h[j].key }
func (h TaskHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *TaskHeap) Push(x any) {
*h = append(*h, x.(Task))
}
func (h *TaskHeap) Pop() any {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func tasks() []Task {
tasks := []Task{}
for i := range n {
tasks = append(tasks, NewTask(
-rand.Intn(1000),
rand.Intn(1000),
-rand.Intn(1000),
-rand.Intn(1000),
i,
rand.Intn(1000),
))
}
return tasks
}
func main() {
tasks := tasks()
h := make(TaskHeap, len(tasks))
heap.Init(&h)
start := time.Now()
for _, task := range tasks {
heap.Push(&h, task)
}
for range len(tasks) {
_ = heap.Pop(&h)
}
elapsed := time.Since(start)
fmt.Println(elapsed)
}