thrift로 정의한 구조체를 시리얼라이즈 할 때, 각 data type이 얼마나 차지하는가 실험
Thrift로 정의한 구조체를 시리얼라이즈 할 때, 각 data type이 얼마나 차지하는지 실험해 보았다.
시리얼라이즈 할 때, 순수한 사이즈를 얻기 위해 압축기능은 배재했다.
실험한 데이터 모음
구조체에 타입 하나씩 type variable 형태로 정의한 뒤,
정의한 변수에 실제 값을 넣기 전과 후의 사이즈를 비교했다.
가령, list와 같은 컨테이너 자료구조를 정의만 하고 사용하지 않았을 때의 사이즈와
list = new list<>()식으로 인스턴스만 시킨 사이즈와
인스턴스된 list에 데이터를 추가했을 때의 사이즈를 비교해 보았다.
data type |
size |
no member |
1 |
bool |
4 |
byte |
4 |
i16 |
5 |
i32 |
7 |
i64 |
11 |
double |
11 |
string string = "" string = "a" string = "ab" |
1 7 8 9 |
list<bool> list = new list<>(); list.add(false) list.add(false).add(true) |
1 8 9 10 |
list<byte> list = new list<>(); list.add(0) list.add(0).add(1) |
1 8 9 10 |
list<i16> list = new list<>(); list.add(0) list.add(0).add(1) |
1 8 10 12 |
list<i32> list = new list<>(); list.add(0) list.add(0).add(1) |
1 8 12 16 |
list<i64> list = new list<>(); list.add(0) list.add(0).add(1) |
1 8 16 24 |
list<double> list = new list<>(); list.add(0) list.add(0).add(1) |
1 8 16 24 |
list<string> list = new list<>(); list.add("") list.add("a") list.add("a").add("b") list.add("a").add("b").add("ab") |
1 8 12 13 18 24 |
set |
list와 동일 |
map<byte.bool> map = new map<>(); map.put(0, false) map.put(0, false).put(1, true) |
1 9 11 13 |
map<byte.byte> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 11 13 |
map<byte.i16> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 12 15 |
map<byte.i32> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 14 19 |
map<byte.i64> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 18 27 |
map<byte.double> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 18 27 |
map<byte.string> map = new map<>(); map.put(0, "") map.put(0, "a") map.put(0, "a").put(1, "b") map.put(0, "a").put(1, "b").put(1, "ab") |
1 9 14 15 21 28 |
map<i16.bool> map = new map<>(); map.put(0, false) map.put(0, false).put(1, true) |
1 9 12 15 |
map<i16.byte> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 12 15 |
map<i16.i16> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 13 17 |
map<i16.i32> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 15 21 |
map<i16.i64> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 19 29 |
map<i16.double> map = new map<>(); map.put(0, 0) map.put(0, 0).put(1, 1) |
1 9 19 29 |
map<i16.string> map = new map<>(); map.put(0, "") map.put(0, "a") map.put(0, "a").put(1, "b") map.put(0, "a").put(1, "b").put(1, "ab") |
1 9 15 16 23 31 |
map<string.bool> map = new map<>(); map.put("0", false) map.put("0", false).put("1", true) |
1 9 15 21 |
map<string.byte> map = new map<>(); map.put("0", 0) map.put("0", 0).put("1", 1) |
1 9 15 21 |
map<string.i16> map = new map<>(); map.put("0", 0) map.put("0", 0).put("1", 1) |
1 9 16 23 |
map<string.i32> map = new map<>(); map.put("0", 0) map.put("0", 0).put("1", 1) |
1 9 18 27 |
map<string.i64> map = new map<>(); map.put("0", 0) map.put("0", 0).put("1", 1) |
1 9 22 35 |
map<string.double> map = new map<>(); map.put("0", 0) map.put("0", 0).put("1", 1) |
1 9 22 35 |
map<string.string> map = new map<>(); map.put("0", "") map.put("0", "a") map.put("0", "a").put("1", "b") map.put("0", "a").put("1", "b").put("1", "ab") |
1 9 18 19 29 40 |
정리
Type |
구조체에 type variable 형태로 사용시 실제 사이즈 + 해더(3bytes) |
컨테이너(map, set, list)에서 데이터 추가시 type의 실제 사이즈만큼만 증가 |
bool |
1 + 3 |
1 |
byte |
1 + 3 |
1 |
i16 |
2 + 3 |
2 |
i32 |
4 + 3 |
4 |
i64 |
8 + 3 |
8 |
double |
8 + 3 |
8 |
string |
4 + 3 |
4 |
map |
6 + 3 |
map<T, map<X,Y>> 6 |
list |
5 + 3 |
map<T, list<X>> 5 |
set |
5 + 3 |
map<T, set<X>> 5 |