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