Go의 데이터 지향 개미
4184 단어 performancegoarchitecture
유형 정의
"Ant"에 8개의 필드, 4개의 int 및 4개의 문자열이 있다고 가정해 보겠습니다.
// An Ant is a struct with a few arbitrary fields.
type Ant struct {
Field1 int
Field2 string
Field3 int
Field4 string
Field5 int
Field6 string
Field7 int
Field8 string
}
여기에 제시된 숫자는 int
가 8바이트이고 string
헤더가 16바이트인 64비트 시스템에 적용됩니다.
개미 군집을 나타내는 간단한 방법은 인접한 개미 조각입니다.
// An AntColony is a slice of Ants.
type AntColony []Ant
개미 군집을 나타내는 간단한 데이터 지향 방법은 각 필드의 모든 값을 자체 슬라이스로 묶는 것입니다.
// A DataOrientedAntColony is an alternative representation of
// an AntColony, where all the values of each fields are stored
// in a contiguous slice, in a data-oriented manner.
type DataOrientedAntColony struct {
Field1 []int
Field2 []string
Field3 []int
Field4 []string
Field5 []int
Field6 []string
Field7 []int
Field8 []string
}
다음은 유형 정의의 the source입니다.
벤치마크
벤치마크는 the source입니다.
(article에 설명된 대로) 병목 현상이 메모리의 데이터에 액세스하므로 주 메모리에서 더 적은 바이트를 가져오는 것이 더 빨라야 하기 때문에 일부 액세스 패턴의 경우 "데이터 지향"접근 방식이 더 빠를 것이라는 일반적인 기대가 있습니다. , 필드의 하위 집합에만 관심이 있는 경우.
개미 1,000,000마리의 경우:
// An Ant is a struct with a few arbitrary fields.
type Ant struct {
Field1 int
Field2 string
Field3 int
Field4 string
Field5 int
Field6 string
Field7 int
Field8 string
}
// An AntColony is a slice of Ants.
type AntColony []Ant
// A DataOrientedAntColony is an alternative representation of
// an AntColony, where all the values of each fields are stored
// in a contiguous slice, in a data-oriented manner.
type DataOrientedAntColony struct {
Field1 []int
Field2 []string
Field3 []int
Field4 []string
Field5 []int
Field6 []string
Field7 []int
Field8 []string
}
벤치마크는 the source입니다.
(article에 설명된 대로) 병목 현상이 메모리의 데이터에 액세스하므로 주 메모리에서 더 적은 바이트를 가져오는 것이 더 빨라야 하기 때문에 일부 액세스 패턴의 경우 "데이터 지향"접근 방식이 더 빠를 것이라는 일반적인 기대가 있습니다. , 필드의 하위 집합에만 관심이 있는 경우.
개미 1,000,000마리의 경우:
SearchByField1: 전체 콜로니 횡단,
Field1
만 사용(int)SearchByField2: 전체 콜로니 횡단,
Field2
만 사용(문자열)검사: 전체 식민지를 횡단하고
Field1
, Field3
, Field5
, Field7
를 사용합니다.결과
$ go test -bench=.
cpu: Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz
BenchmarkAntSearchByField1-4 172 6943993 ns/op
BenchmarkDOAntSearchByField1-4 2064 604584 ns/op
BenchmarkAntSearchByField2-4 100 13402776 ns/op
BenchmarkDOAntSearchByField2-4 244 4948108 ns/op
BenchmarkAntInspect-4 86 13767480 ns/op
BenchmarkDOAntInspect-4 100 10134642 ns/op
$ go test -bench=.
cpu: Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz
BenchmarkAntSearchByField1-4 172 6943993 ns/op
BenchmarkDOAntSearchByField1-4 2064 604584 ns/op
BenchmarkAntSearchByField2-4 100 13402776 ns/op
BenchmarkDOAntSearchByField2-4 244 4948108 ns/op
BenchmarkAntInspect-4 86 13767480 ns/op
BenchmarkDOAntInspect-4 100 10134642 ns/op
결론
단순한 데이터 지향 메모리 레이아웃은 극적인 속도 향상을 제공할 수 있습니다.
Reference
이 문제에 관하여(Go의 데이터 지향 개미), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/deleplace/data-oriented-ant-in-go-3eki
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Go의 데이터 지향 개미), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/deleplace/data-oriented-ant-in-go-3eki텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)