목차
질문 내용
해결책
백엔드 개발 Golang '인터페이스{}'를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?

'인터페이스{}'를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?

Feb 12, 2024 pm 10:15 PM
암시적 변환

인터페이스{}를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?

PHP에서는 "인터페이스{}" 유형을 슬라이스 유형으로 변환할 때 추가 힙 할당이 발생합니다. 이는 PHP에서 인터페이스는 추상 데이터 유형이고 슬라이스는 동적 배열 유형이기 때문입니다. 인터페이스 유형을 슬라이스 유형으로 변환할 때 PHP는 슬라이스 요소를 저장하기 위해 슬라이스 유형에 추가 메모리 공간을 할당해야 합니다. 이러한 추가 힙 할당 작업으로 인해 추가 메모리 오버헤드가 발생하여 일부 메모리에 민감한 애플리케이션에 성능 문제가 발생할 수 있습니다. 따라서 타입 변환을 수행할 때 이 문제에 주의하고 불필요한 추가 힙 할당을 피하도록 노력해야 합니다.

질문 내용

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        return make([]byte, 1024)
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().([]byte)
        p.put(bts)
    }
}
로그인 후 복사

이 벤치마크는 go1.19.5에서 다음과 같은 출력을 제공합니다.

으아악

사용하면 상황이 다르게 보입니다. *[]byte:

으아악 으아악

interface{} 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 것 같습니다.

왜 go에 이러한 추가 할당이 필요한가요? 이에 대한 디자인 고려 사항은 무엇입니까?

해결책

할당의 원인은 any[]byte 的转换,而是 []byteany 的转换。 p.Put(bts) 将参数 bts 隐式转换为 any,然后再将其传递给 (*sync.Pool).Put아닙니다. GoGC 1.19의 인터페이스는 한 쌍의 포인터로 구현됩니다. 하나는 유형 메타데이터를 가리키고 다른 하나는 실제 개체를 가리킵니다. 이 경우 두 번째 포인터가 풀로 이스케이프되어 슬라이스 개체가 할당됩니다. 이는 슬라이스 유형뿐만 아니라 포인터가 아닌 다른 유형에도 적용됩니다.

*[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除 *[]byte와 같은 포인터의 경우 컴파일러는 해당 값을 iface 구조에 직접 배치하여 최적화를 수행하므로 인터페이스로 변환할 때

인스턴스 할당을 제거합니다. 따라서 일반적으로 포인터를 구조체 자체보다는 풀에 넣는 것이 좋습니다. 🎜

위 내용은 '인터페이스{}'를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바에서 short를 사용하는 방법 자바에서 short를 사용하는 방법 May 07, 2024 am 03:33 AM

short는 -32,768에서 32,767 범위의 16비트 부호 있는 정수를 나타내는 Java의 기본 데이터 유형입니다. 카운터나 ID와 같은 작은 정수를 나타내는 데 자주 사용되며 기본적인 산술 연산 및 유형 변환을 지원합니다. 하지만 short는 부호 있는 형식이므로 나누기를 사용할 때 오버플로나 언더플로를 방지하도록 주의해야 합니다.

SQL에서 ifnull 사용법 SQL에서 ifnull 사용법 Apr 28, 2024 am 09:57 AM

IFNULL 함수는 표현식이 NULL인지 확인하고, 그렇다면 지정된 기본값을 반환하고, 그렇지 않으면 표현식의 값을 반환합니다. 널값으로 인한 오류를 방지하고, 널값 조작을 허용하며, 쿼리의 가독성을 향상시킵니다. 사용법에는 null 값을 기본값으로 바꾸는 것, 계산에서 null 값을 제외하는 것, 여러 null 값 상황을 처리하기 위한 중첩된 사용법이 포함됩니다.

자바에서 char 은(는) 무슨 뜻인가요? 자바에서 char 은(는) 무슨 뜻인가요? May 01, 2024 pm 06:15 PM

Java의 char 유형은 U+0000에서 U+FFFF까지의 2바이트를 차지하는 단일 유니코드 문자를 저장하는 데 사용됩니다. 주로 작은 따옴표나 유니코드 이스케이프 시퀀스를 통해 초기화할 수 있습니다. 비교에 참여할 수 있으며, Equality, inequality 및 Join 작업은 암시적으로 int 유형으로 변환되거나 명시적으로 Character 객체로 변환될 수 있습니다.

C언어에서 나눗셈을 계산하는 방법 C언어에서 나눗셈을 계산하는 방법 Apr 13, 2024 pm 09:12 PM

C 언어에서 나누기 연산자 /의 동작은 피연산자의 데이터 유형에 따라 다릅니다. 정수 나누기: 피연산자가 정수이면 정수 나누기가 수행되고 결과는 반내림됩니다. 부동 소수점 나누기: 피연산자가 부동 소수점 숫자인 경우 부동 소수점 나누기가 수행되고 결과는 부동 소수점 숫자입니다. 유형 변환: 한 피연산자는 정수이고 다른 피연산자는 그렇지 않은 경우 정수가 암시적으로 부동 소수점 숫자로 변환된 후 부동 소수점 나누기가 수행됩니다. 0으로 나누기: 나누기가 0이면 수학적 오류가 발생합니다. 모듈로 연산: 모듈로 연산에는 모듈로 나누기 대신 % 연산자를 사용합니다.

오라클에서 (+의 사용법 오라클에서 (+의 사용법 May 08, 2024 pm 08:12 PM

Oracle의 더하기(+) 연산자는 문자열, 숫자, 날짜 및 시간 간격을 연결하고 NULL 값을 처리하고 NULL을 NULL이 아닌 값으로 변환하는 데 사용할 수 있습니다.

*는 mysql에서 무엇을 의미합니까? *는 mysql에서 무엇을 의미합니까? Apr 26, 2024 am 07:21 AM

MySQL에서 별표(*)는 "모두"를 의미하며 다양한 용도로 사용됩니다. 모든 열 선택 모든 행 선택 테이블에 대한 JOIN 와일드카드 LIKE 절 REGEXP 절에 대한 수량자 암시적 유형 변환

C++ 함수 오버로딩에 대한 일치 규칙은 무엇입니까? C++ 함수 오버로딩에 대한 일치 규칙은 무엇입니까? Apr 27, 2024 am 08:27 AM

C++ 함수 오버로드 일치 규칙은 다음과 같습니다. 호출의 매개변수 수와 유형을 일치시킵니다. 매개변수의 순서는 일관되어야 합니다. constness와 참조 수정자는 일치해야 합니다. 기본 매개변수를 사용할 수 있습니다.

암시적 유형 변환의 일반적인 애플리케이션 시나리오를 살펴보겠습니다! 암시적 유형 변환의 일반적인 애플리케이션 시나리오를 살펴보겠습니다! Jan 11, 2024 pm 04:45 PM

암시적 유형 변환의 일반적인 애플리케이션 시나리오를 살펴보겠습니다! 소개: 프로그래밍 언어에서 암시적 유형 변환은 자동으로 수행되는 데이터 유형 변환 프로세스입니다. 일부 프로그래밍 언어에서는 이 변환이 컴파일러나 인터프리터에게 변환을 수행하도록 명시적으로 지시할 필요 없이 암시적으로 수행됩니다. 암시적 유형 변환에는 프로그래밍의 광범위한 애플리케이션 시나리오가 있습니다. 이 기사에서는 몇 가지 일반적인 애플리케이션 시나리오에 대해 설명합니다. 수치 계산의 암시적 유형 변환 수치 계산에서는 서로 다른 유형의 데이터 간의 연산이 필요한 경우가 많습니다. 데이터 종류가 다를 때

See all articles