openai_account_scheduler_benchmark_test.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package service
  2. import (
  3. "sort"
  4. "testing"
  5. )
  6. func buildOpenAISchedulerBenchmarkCandidates(size int) []openAIAccountCandidateScore {
  7. if size <= 0 {
  8. return nil
  9. }
  10. candidates := make([]openAIAccountCandidateScore, 0, size)
  11. for i := 0; i < size; i++ {
  12. accountID := int64(10_000 + i)
  13. candidates = append(candidates, openAIAccountCandidateScore{
  14. account: &Account{
  15. ID: accountID,
  16. Priority: i % 7,
  17. },
  18. loadInfo: &AccountLoadInfo{
  19. AccountID: accountID,
  20. LoadRate: (i * 17) % 100,
  21. WaitingCount: (i * 11) % 13,
  22. },
  23. score: float64((i*29)%1000) / 100,
  24. errorRate: float64((i * 5) % 100 / 100),
  25. ttft: float64(30 + (i*3)%500),
  26. hasTTFT: i%3 != 0,
  27. })
  28. }
  29. return candidates
  30. }
  31. func selectTopKOpenAICandidatesBySortBenchmark(candidates []openAIAccountCandidateScore, topK int) []openAIAccountCandidateScore {
  32. if len(candidates) == 0 {
  33. return nil
  34. }
  35. if topK <= 0 {
  36. topK = 1
  37. }
  38. ranked := append([]openAIAccountCandidateScore(nil), candidates...)
  39. sort.Slice(ranked, func(i, j int) bool {
  40. return isOpenAIAccountCandidateBetter(ranked[i], ranked[j])
  41. })
  42. if topK > len(ranked) {
  43. topK = len(ranked)
  44. }
  45. return ranked[:topK]
  46. }
  47. func BenchmarkOpenAIAccountSchedulerSelectTopK(b *testing.B) {
  48. cases := []struct {
  49. name string
  50. size int
  51. topK int
  52. }{
  53. {name: "n_16_k_3", size: 16, topK: 3},
  54. {name: "n_64_k_3", size: 64, topK: 3},
  55. {name: "n_256_k_5", size: 256, topK: 5},
  56. }
  57. for _, tc := range cases {
  58. candidates := buildOpenAISchedulerBenchmarkCandidates(tc.size)
  59. b.Run(tc.name+"/heap_topk", func(b *testing.B) {
  60. b.ReportAllocs()
  61. for i := 0; i < b.N; i++ {
  62. result := selectTopKOpenAICandidates(candidates, tc.topK)
  63. if len(result) == 0 {
  64. b.Fatal("unexpected empty result")
  65. }
  66. }
  67. })
  68. b.Run(tc.name+"/full_sort", func(b *testing.B) {
  69. b.ReportAllocs()
  70. for i := 0; i < b.N; i++ {
  71. result := selectTopKOpenAICandidatesBySortBenchmark(candidates, tc.topK)
  72. if len(result) == 0 {
  73. b.Fatal("unexpected empty result")
  74. }
  75. }
  76. })
  77. }
  78. }