diff --git a/app/checker/checker.go b/app/checker/checker.go index 51959b8..021e5b7 100644 --- a/app/checker/checker.go +++ b/app/checker/checker.go @@ -268,33 +268,18 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist { // calcParameters вычисляет оптимальное количество горутин и таймаут запроса func calcParameters(count int) (time.Duration, int) { - // коэффициент нагрузки - var k float32 - // чем ниже, тем больше горутин, меньше таймаут, быстрее проверка, хуже результаты - // чем выше, тем меньше горутин, больше таймаут, медленнее проверка, лучше результаты + var routines int + var percentage float32 - switch true { - case count >= 4000: - k = 5 - case count >= 3000: - k = 4.5 - case count >= 2500: - k = 4 - case count >= 2000: - k = 3.5 - case count >= 1500: - k = 3 - case count >= 1000: - k = 2.5 - case count >= 500: - k = 2 - case count >= 100: - k = 1.5 - default: - k = 1 + if count <= 100 { + routines = count + } else { + percentage = float32(runtime.NumCPU()) * 0.075 + for percentage >= 1 { + percentage *= 0.5 + } + routines = int(float32(count) * percentage) } - - routines := int(float32(count) / k / float32(runtime.NumCPU())) if routines > 500 { routines = 500 } @@ -302,7 +287,7 @@ func calcParameters(count int) (time.Duration, int) { routines = 1 } - timeout := 10/k + 2 + timeout := 10 / float32(count) * 150 if timeout > 10 { timeout = 10 } @@ -312,7 +297,7 @@ func calcParameters(count int) (time.Duration, int) { duration := time.Duration(timeout) * time.Second log.Printf( - "Check parameters calculated: count=%d timeout=%.2fs routines=%d\n", + "Check parameters calculated count=%d timeout=%.2fs routines=%d\n", count, duration.Seconds(), routines,