본문 바로가기

Backend/Javascript

[Javascript] - Optimization

Optimization (최적화)

 

- 성능

 

오늘날의 기기들은 빠르고, 성능은 고려할 대상이 아닌 것처럼 보입니다. 우리가 필요로 하는 것 이상의 프로세서를 갖고 있으며 프로세서 대부분은 많은 시간 동안 놀고 있습니다.

 

하지만 어떤 것은 아직 충분히 빠르지 못한데, 일부의 경우 프로그램의 크기가 증가하는 속도를 용량이 따라가지 못하기 때문입니다.

자바스크립트가 지배하고 있는 사용자와의 상호 작용 영역에서는 아무리 빨라도, 느리다고 느껴질 수 있습니다.

 

성능에 대해 여전히 관심을 가져야 하지만, 적절한 수준을 유지해야 합니다. 최적화는 상황을 더 악화시킬 수 있습니다.

괄목할 만한 향상이 있는 최적화만 해야 합니다. (최적화를 최적화할 필요가 있습니다)

 

- 측정

 

프로그램을 실행하고, 실행하는 데 얼마나 많은 시간이 소요되는지 성능은 측정할 수 있습니다.

 

흔한 방식은 언어 두 개의 기능을 반복문을 통해 실행한 다음 실행 시간을 측정하는 것입니다.

결과가 크게 의미 없을 수 있고, 문맥상으로 보았을 때 실제 프로그램에서는 눈에 띄는 차이가 없을 수도 있습니다.

그 대신 더 일기 쉽고 더 유지보수 하기 쉬운 기능을 골라야 합니다.

 

- 측정하고, 잘라내고, 다시 측정하라

 

최적화하기 전에 우선 최적화하고 싶은 코드의 성능을 측정해야 합니다.

측정한 코드가 실행시간을 생각만큼 많이 차지하지 않는다면, 최적화할 다른 곳을 찾고, 주의 깊게 코드를 최적화 한 후 재측정합니다.

기준 시간에 비해 새로운 코드가 큰 향상을 보이지 않았으면 굳이 변경하진 않습니다.

 

대부분의 최적화는 또 다른 실행경로를 추가하고 일반성을 제거함으로써 코드에 복잡성을 더합니다.

이렇게 하면 코드는 점점 커지고, 유지하기 어렵고, 제대로 된 테스트를 하기 힘들어집니다.

깔끔한 코드는 추론하기도 쉽고 유지하기도 좋으므로, 깔끔함을 지키는게 더 좋습니다.

 

- 시간을 갉아먹는 것들

 

코드 레벨의 수정보다는, 속도 저하의 근본 원인을 해결 못해서 느린 경우가 더 많습니다.

 

‣ 병렬화에 실패

 

규모가 커지면 병렬성이 순차 처리를 이깁니다.

 

‣ 턴의 법칙

 

프로세싱 루프가 중간에 멈추게 되면, 그 뒤로 처리되어야 하는 큐의 모든 작업에 멈춘 시간만큼 지연이 추가됩니다.

이렇게 지연이 누적되면 큐의 작업이 영원히 비워지지 않을 수 있습니다.

 

‣ 낮은 응집도

 

모듈의 응집도가 낮으면 할 필요가 없는 일을 할 가능성이 큽니다.

 

‣ 강한 결합도

 

모듈들이 강하게 결합된다면 지역성을 포기하는 것입니다.

 

‣ 잘못된 알고리즘

 

시간복잡도를 고려하지 않은 알고리즘의 사용은 시간을 많이 갉아먹습니다.

 

‣ 스래싱

 

너무 많은 불필요한 정보들이 캐시를 통해 들어와 재사용될 만한 것들을 캐시에서 밀어버리기도 합니다.

 

‣ 비대한 소프트웨어

 

코드가 크고 비대해지면 프로그램이 뭘 하는지 제대로 이해하기 어렵습니다.

 

‣ 다른 사람이 만든 코드

 

대체로 다른 패키지나 라이브러리, 플랫폼등은 본인의 코드를 수정한다고 해서 빨리 실행되지 않습니다.

 

- 언어

 

최적화에 투자하는 가장 좋은 방법은 언어 엔진일 수 있습니다.

 

자바스크립트 엔진은 꽤 빨라지긴 했지만 점점 더 복잡해졌습니다.

규모가 큰 프로그램을 최적화는 확실히 빠르게 해 주지만, 그만큼 시작하는 데 걸리는 시간도 늘어났습니다.

그래서 자바스크립트는 최적화가 안 된 느린 코드로 빨리 시작한 다음, 프로그램이 어떻게 동작하느냐에 따라 최적화하는 행동을 취합니다.

 

언어가 복잡해지면서 최적화도 점점 힘들어지고 있습니다.

 

최적화는 필요하지만 적절히 해야 하고, 그보다 먼저 잘 된 설계를 통해 코드의 비대함을 줄이고 깔끔하게 만들어야 할 것입니다.

 

출처 : 자바스크립트는 왜 그 모양일까?

 

'Backend > Javascript' 카테고리의 다른 글

[Javascript] - Weakness  (0) 2021.02.20
[Javascript] - Transpiling  (0) 2021.02.14
[Javascript] - Testing  (0) 2021.01.30
[Javascript] - JSON  (0) 2021.01.23
[Javascript] - Date  (0) 2021.01.16