>  기사  >  Go 언어의 두 가지 효율적인 팁

Go 언어의 두 가지 효율적인 팁

little bottle
little bottle앞으로
2019-04-30 09:43:483414검색

이 기사에서는 Go 언어의 두 가지 효율적인 팁을 공유합니다. 하나는 + 및 fmt.Sprintf를 사용하여 문자열을 작동하지 않는 것이고, 다른 하나는 고정 필드 [문자열] 인터페이스의 키-값 쌍에 대해 맵 대신 임시 구조체를 사용하는 것입니다. {}.

1. + 및 fmt.Sprintf를 사용하여 문자열을 조작하지 마세요

+는 문자열을 조작하는 데 매우 편리하지만 Go 언어에서 +를 사용하면 프로그램이 스크립트 언어보다 빠르게 실행됩니다. 믿으신다면 직접 테스트를 해보고, + 연산을 사용하고, 100,000번 반복하면 Python과 Javascript가 Go보다 훨씬 빠릅니다(많이, 조금은 아님)

func TestStr(t *testing.T) {
    str := ""
    for i := 0; i < 100000; i++ {
        str += "test"
    }
}

테스트 결과

PASS: TestStr(3.32s)
str=""
for i in range(100000):
    str+="test"
/테스트 결과: ~/»Time Python Test.py

0.03s SYSTEM 81% CPU 0.078 Total

정적 언어로 GO, 실제로 Python Times보다 이렇게 간단한 코드에서 100의 효율성을 수행한다는 사실이 놀랍죠? Go 문제는 아니지만 +를 사용하여 Go에서 문자열을 처리하는 것은 성능 집약적이며 Python은 + 작업 문자열 최적화에 과부하가 걸렸어야 합니다. (Javascript + 연산 문자열도 매우 빠릅니다.)
관련 튜토리얼:

go 비디오 튜토리얼

가장 효과적인 방법은 버퍼를 사용하는 것입니다

strBuf := bytes.NewBufferString("")
for i := 0; i < 100000; i++ {
    strBuf.WriteString("test")
}
결과는 직접 테스트할 수 있으므로 놀랄 것입니다
일부 간단해야 합니다. 두 문자열을 결합하려면 Buffer를 사용하는 것이 약간 번거롭습니다. 생각하기 쉬운 것은 fmt.Sprintf()를 사용하여 결합하는 것입니다. 실제로 fmt의 Sprintf도 매우 느립니다. 복잡한 유형 변환 출력이 없으면 문자열을 사용하는 성능이 훨씬 높아집니다.

func TestStr(t *testing.T) {
    a, b := "Hello", "world"
    for i := 0; i < 1000000; i++ {
        fmt.Sprintf("%s%s", a, b)
        //strings.Join([]string{a, b}, "")
    }
}

PASS: TestStr(0.29s)

func TestStr(t *testing.T) {
    a, b := "Hello", "world"
    for i := 0; i < 1000000; i++ {
        //fmt.Sprintf("%s%s", a, b)
        strings.Join([]string{a, b}, "")
    }
}

PASS: TestStr(0.09s)
결과에 따르면 strings.Join은 Sprint를 사용하는 것보다 약 4배 빠릅니다.
2. 고정 필드의 키-값 쌍의 경우 map[string]인터페이스 대신 임시 구조체를 사용하세요.{}

간단한 예

func TestData(t *testing.T) {

    for i := 0; i < 100000000; i++ {
        var a struct {
            Name string
            Age  int
        }
        a.Name = "Hello"
        a.Age = 10
    }
}

PASS: TestData(0.04s)

func TestData2(t *testing.T) {

    for i := 0; i < 100000000; i++ {
        var a = map[string]interface{}{}
        a["Name"] = "Hello"
        a["Age"] = 10
    }
}

PASS: TestData2(38.30s)
효율이 수천배 다릅니다!
필드가 알려진 경우 임시 구조체를 사용하면 런타임 중에 콘텐츠의 동적 할당이 필요하지 않으며 맵처럼 인덱스를 확인할 필요가 없으므로 속도가 훨씬 빨라집니다.

위 내용은 Go 언어의 두 가지 효율적인 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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