Назад к задачам
Junior — Senior
9

Оптимизация и рефакторинг существующего Go‑кода

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Необходимо выполнить рефакторинг представленного фрагмента программы на Go. Задача подразумевает улучшение читаемости и структуры кода, а также возможную оптимизацию использования памяти. При этом следует оставить всю функциональность без изменений.

func main() {
    var mem runtime.MemStats

    runtime.ReadMemStats(&mem)
    fmt.Printf("Before get(): Alloc = %v MiB\n", mem.Alloc/1024/1024)

    resOfRes := make([][]int, 0, 100)

    for i := 0; i < 50; i++ {
        res := getLastElem()

        runtime.GC()
        runtime.ReadMemStats(&mem)
        fmt.Printf("After getAll(): Alloc = %v MiB, slice: %v\n", mem.Alloc/1024/1024, res)

        resOfRes = append(resOfRes, res)
    }

    fmt.Println()
    _ = resOfRes

    // Now go into loop
    for i := 0; i < 20000; i++ {
        runtime.GC()
        runtime.ReadMemStats(&mem)
        fmt.Printf("Alloc = %v MiB\n", mem.Alloc/1024/1024)
        time.Sleep(time.Second * 2)
    }

    fmt.Println(resOfRes)
}

func getLastElem() []int {
    sl := make([]int, 0, 100000)

    for i := 0; i < 100000; i++ {
        sl = append(sl, i)
    }

    // return last element
    return sl[99999:]
}

В рамках рефакторинга следует обратить внимание на:

  • Выделение повторяющихся операций в отдельные функции;
  • Улучшение именования переменных и функций для повышения самодокументируемости кода;
  • Уменьшение количества прямых вызовов сборщика мусора и измерений памяти, если это не требуется для демонстрации;
  • Возможное использование более эффективных способов создания и работы со срезами.