>  기사  >  백엔드 개발  >  고루틴 수가 증가하면 Go 프로그램 속도가 느려집니다.

고루틴 수가 증가하면 Go 프로그램 속도가 느려집니다.

WBOY
WBOY앞으로
2024-02-09 22:10:101289검색

当 goroutine 数量增加时,Go 程序会变慢

고루틴 수가 늘어나면 Go 프로그램 속도가 느려집니다. 이는 고루틴 스케줄링 및 전환으로 인해 추가 오버헤드가 발생하여 프로그램 성능이 저하되기 때문입니다. 고루틴은 동시성 성능을 제공하는 데 탁월하지만 고루틴이 너무 많으면 스레드 경쟁과 리소스 경합이 발생하여 프로그램의 실행 효율성에 영향을 줄 수 있습니다. 이러한 상황이 발생하지 않도록 하려면 프로그램이 효율적으로 실행될 수 있도록 고루틴 수를 합리적으로 관리하고 제어해야 합니다. 이 기사에서 PHP 편집자 Youzi는 Go 프로그램의 실행 효율성을 향상시키는 데 도움이 되는 고루틴 성능을 최적화하는 몇 가지 방법과 기술을 소개합니다.

질문 내용

저는 병렬 처리 과정을 위한 소규모 프로젝트를 진행 중이며 버퍼링된 채널, 버퍼링되지 않은 채널, 슬라이스에 대한 포인터를 사용하지 않는 채널 등을 사용해 보았습니다. 또한 (현재 상태가 아닌) 가능한 한 많이 최적화하려고 시도했지만 여전히 동일한 결과를 얻습니다. 고루틴 수를 (1개라도) 늘리면 전체 프로그램 속도가 느려집니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? 이 경우 병렬성을 향상시키는 것이 가능합니까?

이것은 코드의 일부입니다:

으아악 으아악

고루틴을 늘리면 프로그램이 더 빠르게 실행될 것으로 예상되었지만 특정 수의 고루틴까지는 고루틴을 늘려도 동일한 실행 시간을 얻거나 약간 느려질 수 있습니다.

편집: 사용된 모든 기능:

func main() {

    rand.seed(time.now().unixmicro())

    numagents := 2

    fmt.println("please pick a number of goroutines: ")
    fmt.scanf("%d", &numagents)

    numfiles := 4
    fmt.println("how many files do you want?")
    fmt.scanf("%d", &numfiles)
    start := time.now()

    numassist := numfiles
    channel := make(chan []file, numagents)
    files := make([]file, 0)

    for i := 0; i < numagents; i++ {
        if i == numagents-1 {
            go generatefiles(numassist, channel)
        } else {
            go generatefiles(numfiles/numagents, channel)
            numassist -= numfiles / numagents
        }
    }

    for i := 0; i < numagents; i++ {
        files = append(files, <-channel...)
    }

    elapsed := time.since(start)
    fmt.printf("function took %s\n", elapsed)
}

Solution

간단히 말하면 파일 생성 코드는 병렬 실행을 정당화할 만큼 복잡하지 않습니다. 채널을 통한 모든 컨텍스트 전환 및 데이터 이동은 병렬 처리의 모든 이점을 활용합니다.

generatefiles 函数的循环中添加类似 time.sleep(time.millisecond * 10)의 콘텐츠를 좀 더 복잡한 작업을 수행하는 것처럼 보면 예상한 대로 볼 수 있을 것입니다. 즉, 고루틴이 많을수록 더 빠르게 작동합니다. 그러나 다시 말하지만, 병렬 처리의 추가 작업은 특정 지점까지만 효과가 있습니다.

프로그램 마지막 비트의 실행 시간도 참고하세요.

으아악

고루틴 수에 직접적으로 의존합니다. 모든 고루틴은 거의 동시에 완료되므로 루프는 작업자 스레드와 병렬로 실행되는 경우가 거의 없으며 실행하는 데 걸리는 시간이 총 시간에 추가됩니다.

다음으로 files 슬라이스에 여러 번 추가하면 슬라이스가 여러 번 늘어나고 데이터를 새 위치에 복사해야 합니다. 처음에 모든 결과 요소를 채우는 조각을 생성하여 이를 방지할 수 있습니다(다행히도 필요한 요소 수를 정확히 알고 있습니다).

위 내용은 고루틴 수가 증가하면 Go 프로그램 속도가 느려집니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제