Skip to content

CRDT 성능 벤치마크 결과

Boseok Kang edited this page Dec 6, 2022 · 1 revision

CRDT 성능 벤치마크 결과

Test Environment

  • node v16.16.0

  • ubuntu 20.04

  • 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz

  • NODE_OPTIONS='--max-old-space-size=8192'

  • Operation 10, 100, 1000, 10000개에 대한 연산 속도 테스트 진행

    • 30분 이상 기다려도 결과가 나오지 않는 경우 1000개까지만 테스트 수행

1차 구현체 테스트 결과

  • 배열 구조
  • 실수 인덱스 기반
**1. LocalInsert 벤치마크**
1-1) 모든 입력이 항상 문서 맨 뒤에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.37688199803233147ms' │
│   100   │ '0.09775499999523163ms' │
│  1000   │ '0.6821510009467602ms'  │
│  10000  │  '5.489331997931004ms'  │
└─────────┴─────────────────────────┘
1-2) 모든 입력이 항상 문서 맨 앞에 들어갈 경우
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.4206710010766983ms' │
│   100   │ '1.6867779977619648ms' │
│  1000   │ '23.745200999081135ms' │
│  10000  │ '2405.3365989997983ms' │
└─────────┴────────────────────────┘
1-3) 모든 입력이 랜덤하게 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.25732799991965294ms' │
│   100   │ '0.46730099990963936ms' │
│  1000   │ '3.7738320007920265ms'  │
│  10000  │ '17.947806999087334ms'  │
└─────────┴─────────────────────────┘
**2. LocalInsertRange 벤치마크**
2-1) 모든 입력(3개를 한번에 입력)이 맨 뒤에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.17020700126886368ms' │
│   100   │ '0.12176800146698952ms' │
│  1000   │ '1.0001230016350746ms'  │
│  10000  │ '10.598441001027822ms'  │
└─────────┴─────────────────────────┘
2-2) 모든 입력(3개를 한번에 입력)이 맨 앞에 들어갈 경우
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.0905969999730587ms' │
│   100   │ '0.7079380005598068ms' │
│  1000   │ '71.19633500277996ms'  │
│  10000  │  '7988.76493300125ms'  │
└─────────┴────────────────────────┘
2-3) 모든 입력(3개를 한번에 입력)이 랜덤하게 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.10565999895334244ms' │
│   100   │ '0.19121100008487701ms' │
│  1000   │ '3.1562880016863346ms'  │
│  10000  │  '530.6779890023172ms'  │
└─────────┴─────────────────────────┘
**3. LocalDelete 벤치마크**
3-1) 하나씩 삭제할 경우
* 여러 개 삭제하는 경우는 하나씩 삭제하는 경우와 동작이 같아 테스트하지 않는다.
* index는 존재하는 문자의 갯수와도 같음
┌─────────┬──────────────────────────┐
│ (index) │          Values          │
├─────────┼──────────────────────────┤
│   10    │ '0.042027998715639114ms' │
│   100   │ '0.11502000316977501ms'  │
│  1000   │  '0.8740459978580475ms'  │
│  10000  │  '55.308225996792316ms'  │
└─────────┴──────────────────────────┘
**4. remoteInsert 벤치마크**
* 현재 양쪽 모두 OperationCount만큼 인덱스가 존재하고 있음
4-1) 모든 remote 요청이 문서 맨 앞에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.2167770005762577ms'  │
│   100   │ '0.31554200127720833ms' │
│  1000   │  '9.717081002891064ms'  │
│  10000  │  '74.41391700133681ms'  │
└─────────┴─────────────────────────┘
4-2) 모든 remote 요청이 문서 중앙에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.10500399768352509ms' │
│   100   │ '0.13489600270986557ms' │
│  1000   │  '83.4189710021019ms'   │
│  10000  │ '105513.33468900248ms'  │
└─────────┴─────────────────────────┘
4-3) 모든 remote 요청이 랜덤하게 들어갈 경우 (Worst)
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.0837399996817112ms'  │
│   100   │ '0.15085000172257423ms' │
│  1000   │  '98.94992200285196ms'  │
│  10000  │  '128999.8691470027ms'  │
└─────────┴─────────────────────────┘
**5. remoteInsertRange 벤치마크**
5-1) 모든 입력(3개를 한번에 입력)이 맨 앞에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.13947099819779396ms' │
│   100   │ '0.2381419986486435ms'  │
│  1000   │ '2.4346319995820522ms'  │
│  10000  │           x             │
└─────────┴─────────────────────────┘
5-2) 모든 입력(3개를 한번에 입력)이 문서 중앙에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.0921889990568161ms'  │
│   100   │ '0.24760700017213821ms' │
│  1000   │ '121.90978699922562ms'  │
│  10000  │           x             │
└─────────┴─────────────────────────┘
5-3) 모든 입력(3개를 한번에 입력)이 랜덤하게 들어갈 경우 (Worst)
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.0691090002655983ms' │
│   100   │ '0.4747540019452572ms' │
│  1000   │ '295.60797299817204ms' │
│  10000  │           x            │
└─────────┴────────────────────────┘
**6. remoteDelete 벤치마크**
6-1) 한 글자를 삭제하는 요청이 Index번 들어올 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.13987799733877182ms' │
│   100   │  '9.888956002891064ms'  │
│  1000   │  '8682.433924999088ms'  │
│  10000  │           x             │
└─────────┴─────────────────────────┘
**7. remoteDeleteRange 벤치마크**
7-1) index만큼의 문자를 한번에 삭제하는 요청이 들어올 경우 (요청은 단 1번)
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.18517900258302689ms' │
│   100   │ '21.421654999256134ms'  │
│  1000   │ '13864.950212996453ms'  │
│  10000  │           x             │
└─────────┴─────────────────────────┘


2차 구현체 테스트 결과

  • 연결리스트 구조
  • WOOT 알고리즘 기반
  • uuid 인덱스
**1. LocalInsert 벤치마크**
1-1) 모든 입력이 항상 문서 맨 뒤에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.25197600200772285ms' │
│   100   │ '0.5542510002851486ms'  │
│  1000   │  '12.69480399787426ms'  │
│  10000  │ '1402.8910789974034ms'  │
└─────────┴─────────────────────────┘
1-2) 모든 입력이 항상 문서 맨 앞에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.27826299890875816ms' │
│   100   │ '0.27261799946427345ms' │
│  1000   │  '2.572216000407934ms'  │
│  10000  │  '16.85019099712372ms'  │
└─────────┴─────────────────────────┘
1-3) 모든 입력이 랜덤하게 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.23609299957752228ms' │
│   100   │ '0.3446579985320568ms'  │
│  1000   │  '9.23089700192213ms'   │
│  10000  │ '1567.9071290008724ms'  │
└─────────┴─────────────────────────┘
**2. LocalInsertRange 벤치마크**
2-1) 모든 입력(3개를 한번에 입력)이 맨 뒤에 들어갈 경우
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.2208320014178753ms' │
│   100   │ '1.4140230007469654ms' │
│  1000   │ '111.9740609973669ms'  │
│  10000  │ '23545.804039999843ms' │
└─────────┴────────────────────────┘
2-2) 모든 입력(3개를 한번에 입력)이 맨 앞에 들어갈 경우
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.167238000780344ms'  │
│   100   │ '0.5629189983010292ms' │
│  1000   │ '4.481447000056505ms'  │
│  10000  │ '50.17932200059295ms'  │
└─────────┴────────────────────────┘
2-3) 모든 입력(3개를 한번에 입력)이 랜덤하게 들어갈 경우
┌─────────┬────────────────────────┐
│ (index) │         Values         │
├─────────┼────────────────────────┤
│   10    │ '0.1647530011832714ms' │
│   100   │ '1.3897559978067875ms' │
│  1000   │ '56.82490799948573ms'  │
│  10000  │ '17792.42253500223ms'  │
└─────────┴────────────────────────┘
**3. LocalDelete 벤치마크**
3-1) 하나씩 삭제할 경우
* 여러 개 삭제하는 경우는 하나씩 삭제하는 경우와 동작이 같아 테스트하지 않는다.
* index는 존재하는 문자의 갯수와도 같음
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.10416899994015694ms' │
│   100   │ '0.35487500205636024ms' │
│  1000   │ '15.132245998829603ms'  │
│  10000  │  '1676.544725999236ms'  │
└─────────┴─────────────────────────┘
**4. remoteInsert 벤치마크**
* 현재 양쪽 모두 OperationCount만큼 인덱스가 존재하고 있음
4-1) 모든 remote 요청이 문서 맨 앞에 들어갈 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.14322800189256668ms' │
│   100   │ '0.09084499999880791ms' │
│  1000   │ '0.31654199957847595ms' │
│  10000  │  '4.483823999762535ms'  │
└─────────┴─────────────────────────┘
4-2) 모든 remote 요청이 문서 중앙에 들어갈 경우
┌─────────┬──────────────────────────┐
│ (index) │          Values          │
├─────────┼──────────────────────────┤
│   10    │ '0.07863299921154976ms'  │
│   100   │ '0.017465002834796906ms' │
│  1000   │  '0.5406839996576309ms'  │
│  10000  │  '12.807269997894764ms'  │
└─────────┴──────────────────────────┘
4-3) 모든 remote 요청이 랜덤하게 들어갈 경우 (Worst)
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.3057530000805855ms'  │
│   100   │ '0.09170899912714958ms' │
│  1000   │ '0.4828599989414215ms'  │
│  10000  │  '4.328271999955177ms'  │
└─────────┴─────────────────────────┘
**5. remoteInsertRange 벤치마크**
5-1) 모든 입력(3개를 한번에 입력)이 맨 앞에 들어갈 경우
┌─────────┬──────────────────────────┐
│ (index) │          Values          │
├─────────┼──────────────────────────┤
│   10    │ '0.023224998265504837ms' │
│   100   │ '0.03811799734830856ms'  │
│  1000   │  '0.5335679985582829ms'  │
│  10000  │  '4.851831998676062ms'   │
└─────────┴──────────────────────────┘
5-2) 모든 입력(3개를 한번에 입력)이 문서 중앙에 들어갈 경우
┌─────────┬──────────────────────────┐
│ (index) │          Values          │
├─────────┼──────────────────────────┤
│   10    │ '0.039618998765945435ms' │
│   100   │ '0.02907399833202362ms'  │
│  1000   │  '0.7040100023150444ms'  │
│  10000  │  '6.956870999187231ms'   │
└─────────┴──────────────────────────┘
5-3) 모든 입력(3개를 한번에 입력)이 랜덤하게 들어갈 경우 (Worst)
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.06398800015449524ms' │
│   100   │ '0.05734200030565262ms' │
│  1000   │  '0.933278001844883ms'  │
│  10000  │  '6.884066000580788ms'  │
└─────────┴─────────────────────────┘
**6. remoteDelete 벤치마크**
6-1) 한 글자를 삭제하는 요청이 Index번 들어올 경우
┌─────────┬─────────────────────────┐
│ (index) │         Values          │
├─────────┼─────────────────────────┤
│   10    │ '0.21628399938344955ms' │
│   100   │ '0.33590999990701675ms' │
│  1000   │ '13.710884001106024ms'  │
│  10000  │ '1969.9382079988718ms'  │
└─────────┴─────────────────────────┘
**7. remoteDeleteRange 벤치마크**
7-1) index만큼의 문자를 한번에 삭제하는 요청이 들어올 경우 (요청은 단 1번)
┌─────────┬──────────────────────────┐
│ (index) │          Values          │
├─────────┼──────────────────────────┤
│   10    │ '0.01687299832701683ms'  │
│   100   │ '0.008090998977422714ms' │
│  1000   │ '0.06868700310587883ms'  │
│  10000  │  '1.1141079999506474ms'  │
└─────────┴──────────────────────────┘
Clone this wiki locally