본문 바로가기

Development/TIL

비교 단위별 Diff 및 Patch 코드 동작 속도 측정

문장 단위 diff 및 patch 알고리즘 구현이 완료되었다.

현재까지는 특이사항 없이 안정적으로 작동하는 것으로 확인된다.

그런데 문득 글자와 문장 단위 diff 및 patch 코드 동작 속도가 궁금해졌다.

그래서 각각 속도 측정을 하여 비교해보았다.

 

프로젝트 폴더에서 테스트를 진행할 수 없어 새 폴더를 만들었다.

그런데 서버까지 만들기는 번거로워서 터미널을 통해 코드 동작 속도를 확인하는 방법을 찾아봤다.

 

 

 

타입스크립트 코드 실행 시간 측정 방법

실행 시간을 측정하고자 하는 코드 시작과 끝 지점에 아래 코드를 넣으면 된다.

(간단해서 좋았다!)

const start = performance.now();

// 성능을 측정하려는 코드 블록 또는 함수 실행

const end = performance.now();
const duration = end - start;

console.log(`코드 실행 시간: ${duration}ms`);

결과

아래 사진과 같이 코드 실행 시간을 확인할 수 있다.

참조

https://adjh54.tistory.com/37

 

[JS] 함수 실행시간 측정 방법

해당 글은 Javascript 내에서 함수의 실행시간을 측정하는 방법들을 설명하는 글입니다. 1) Date()를 이용한 측정방식 💡 해당 방식은 함수 시작전에 도출한 new Date() 값과 함수 종료후에 도출한 new Da

adjh54.tistory.com

 

 

 

비교 단위별 코드 실행 속도 측정

조건 글자 단위 diff 글자 단위 patch 문장 단위 diff 문장 단위 patch
원본 문서
384글자, 5문장

수정본
568글자, 9문장
약 26ms 약 0.03ms 약 0.3ms 약 0.3ms
원본 문서
768글자, 10문장

수정본
1,136글자, 18문장
약 52ms 약 0.3ms 약 0.5ms 약 0.9ms
장점 - 원본 문서와 변경 사항 데이터를 합치는 patch과 정은 문장 단위 비교 보다 빠르다.

- diff 데이터가 글자 단위로 출력되므로
문장 단위 diff 데이터 보다 크기가 작아 db에 가는
부담이 적다.
비교할 문서의 용량이 커지면 소요 시간이 증가하는 것은 글자 단위 비교와 같지만 속도가 전체적으로 안정적이다.
단점 글자 단위 비교를 하므로 문서의 크기가 커질 수록 diff와 patch의 소요 시간이 배로 증가한다. 문장 단위 비교를 하기 때문에 diff 데이터가 문장 단위로 출력되므로 db에는 글자 단위 diff 데이터보다 부담이 증가한다.

 

 

글자 단위 diff 데이터 (원본 문서768글자, 10문장 / 수정본1,136글자, 18문장)

[
  {
    type: 'add',
    value: '이들이 거래한 마약은 약 8kg가량의 필로폰으로 시세로는 288억원 가량의 마약',
    idx: 191
  },
  { type: 'add', value: '었다.</p><p>일반적으로 대만, 중국, 일본의 폭력조직', idx: 236 },
  {
    type: 'add',
    value: '이 한국내에 마약을 밀수하는 경우는 많았다.</p><p>하지만 이',
    idx: 269
  },
  {
    type: 'add',
    value: '다.</p><p>이중 야쿠자과 거래한 8kg의 마약만 압수된 상황이라 나머지 8kg의 마약의 행방은 밝혀지지 않았다고 한',
    idx: 385
  },
  { type: 'add', value: '다.</p><p>', idx: 532 },
  { type: 'remove', value: '는데, ', idx: 353 },
  {
    type: 'add',
    value: '이들이 거래한 마약은 약 8kg가량의 필로폰으로 시세로는 288억원 가량의 마약',
    idx: 759
  },
  { type: 'add', value: '었다.</p><p>일반적으로 대만, 중국, 일본의 폭력조직', idx: 804 },
  {
    type: 'add',
    value: '이 한국내에 마약을 밀수하는 경우는 많았다.</p><p>하지만 이',
    idx: 837
  },
  {
    type: 'add',
    value: '다.</p><p>이중 야쿠자과 거래한 8kg의 마약만 압수된 상황이라 나머지 8kg의 마약의 행방은 밝혀지지 않았다고 한',
    idx: 953
  },
  { type: 'add', value: '다.</p><p>', idx: 1100 },
  { type: 'remove', value: '는데, ', idx: 737 }
]

 

 

문장 단위 diff 데이터 (원본 문서768글자, 10문장 / 수정본1,136글자, 18문장)

[
  {
    type: 'remove',
    value: '<p>이들 조직들이 한국에서 서로 거래를 한건 매우 이례적이라고 한다.',
    idx: 2
  },
  {
    type: 'add',
    value: '<p>이들이 거래한 마약은 약 8kg가량의 필로폰으로 시세로는 288억원 가량의 마약이었다.',
    idx: 2
  },
  {
    type: 'remove',
    value: '<p>이번 거래에서 대만 폭력조직원들이 실제 들고 온 마약은 약 16kg이었다.',
    idx: 3
  },
  {
    type: 'add',
    value: '<p>일반적으로 대만, 중국, 일본의 폭력조직들이 한국내에 마약을 밀수하는 경우는 많았다.',
    idx: 3
  },
  {
    type: 'remove',
    value: '<p>이후 2018년 10월 15일 이나가와카이 간부급 조직원이 참여하여 국내 사상 최대 분량의 필로폰을 밀수하다가 조직원이 노출되었는데, 이 금액이 무려 3700억원이었다고 한다.',
    idx: 4
  },
  {
    type: 'add',
    value: '<p>하지만 이 조직들이 한국에서 서로 거래를 한건 매우 이례적이라고 한다.',
    idx: 4
  },
  {
    type: 'add',
    value: '<p>이번 거래에서 대만 폭력조직원들이 실제 들고 온 마약은 약 16kg이었다.',
    idx: 5
  },
  {
    type: 'add',
    value: '<p>이중 야쿠자과 거래한 8kg의 마약만 압수된 상황이라 나머지 8kg의 마약의 행방은 밝혀지지 않았다고 한다.',
    idx: 6
  },
  {
    type: 'add',
    value: '<p>이후 2018년 10월 15일 이나가와카이 간부급 조직원이 참여하여 국내 사상 최대 분량의 필로폰을 밀수하다가 조직원이 노출되었다.',
    idx: 7
  },
  { type: 'add', value: '<p>이 금액이 무려 3700억원이었다고 한다.', idx: 8 },
  {
    type: 'remove',
    value: '<p>이들 조직들이 한국에서 서로 거래를 한건 매우 이례적이라고 한다.',
    idx: 7
  },
  {
    type: 'add',
    value: '<p>이들이 거래한 마약은 약 8kg가량의 필로폰으로 시세로는 288억원 가량의 마약이었다.',
    idx: 11
  },
  {
    type: 'remove',
    value: '<p>이번 거래에서 대만 폭력조직원들이 실제 들고 온 마약은 약 16kg이었다.',
    idx: 8
  },
  {
    type: 'add',
    value: '<p>일반적으로 대만, 중국, 일본의 폭력조직들이 한국내에 마약을 밀수하는 경우는 많았다.',
    idx: 12
  },
  {
    type: 'remove',
    value: '<p>이후 2018년 10월 15일 이나가와카이 간부급 조직원이 참여하여 국내 사상 최대 분량의 필로폰을 밀수하다가 조직원이 노출되었는데, 이 금액이 무려 3700억원이었다고 한다.',
    idx: 9
  },
  {
    type: 'add',
    value: '<p>하지만 이 조직들이 한국에서 서로 거래를 한건 매우 이례적이라고 한다.',
    idx: 13
  },
  {
    type: 'add',
    value: '<p>이번 거래에서 대만 폭력조직원들이 실제 들고 온 마약은 약 16kg이었다.',
    idx: 14
  },
  {
    type: 'add',
    value: '<p>이중 야쿠자과 거래한 8kg의 마약만 압수된 상황이라 나머지 8kg의 마약의 행방은 밝혀지지 않았다고 한다.',
    idx: 15
  },
  {
    type: 'add',
    value: '<p>이후 2018년 10월 15일 이나가와카이 간부급 조직원이 참여하여 국내 사상 최대 분량의 필로폰을 밀수하다가 조직원이 노출되었다.',
    idx: 16
  },
  { type: 'add', value: '<p>이 금액이 무려 3700억원이었다고 한다.', idx: 17 }
]

 

 

 

 

결론

글자 단위 diff는 얼핏보면 시간 복잡도가 상대적으로 작은 것 같아보이지만 문서의 크기가 커질수록 배로 증가한다.

공간 복잡도는 문장 단위 diff에 비해 낮다.

 

문장 단위 diff는 글자 단위 비교에 상대적으로 시간 복잡도가 낮고 안정적이다.

하지만 db에 저장되는 diff 데이터의 크기가 커서 공간 복잡도 면에서는 글자 단위 diff에 비해 상대적으로 비효율적이다.

 

결국은 시간복잡도와 공간복잡도를 고려하여 최적의 성능과 자원 사용을 달성하는 것이 중요한데,

아직 미천한 나는 결정을 못내리겠다. 팀원들에게 공유하여 의사 결정을 진행하는 것이 좋겠다.

'Development > TIL' 카테고리의 다른 글

Redis Sorted Set (Zset)  (0) 2023.06.21
Nest.js 클러스터링  (0) 2023.06.21
patch 알고리즘 수정 (feat. </p> 태그 지옥)  (0) 2023.06.16
DP, LCS, MED, SES 개념정리  (1) 2023.06.15
문서의 문장 단위 변경 추적  (0) 2023.06.13