반응형

분류 전체보기 702

코드 이름 표기법 종류

형식 이름 twowords 플랫 케이스 (flat case) TWOWORDS 어퍼 플랫 케이스 (upper flat case) twoWords 카멜 케이스 (camel case) TwoWords 파스칼 케이스 (pascal case) two_words 스네이크 케이스 (snake case) TWO_WORDS 스크리밍 스네이크 케이스 (screaming snake case) two_Words 카멜 스네이크 케이스 (camel snake case) Two_Words 파스칼 스네이크 케이스 (pascal snake case) two-words 케밥 케이스 (kabab case) TWO-WORDS 스크리밍 케밥 케이스 (screaming kabab case) Two-Words 트레인 케이스 (train case..

컴퓨터 공학 2022.01.12

Node.js 객체 복사 방식에 따른 수행시간 간단 비교

개요 JS에서 각 객체의 깊은 복사 방식에 따른 수행시간을 간단하게 비교한다. 원본 객체 const obj1 = { a: 1, b: "string", c: { name: "Leon", age: "29" } }; JSON 복사 function jsonCopy(obj){ return JSON.parse(JSON.stringify(obj)); } Lodash 복사 function lodashCopy(obj){ return lodash.cloneDeep(obj); } 재귀함수 복사 /** 객체 깊은 복사 */ function cloneObjectDeep(obj) { const clone = {}; if (typeof obj !== 'object') return obj; for (const key in obj) ..

윈도우 11에서 느려진 탐색기 10 버전으로 복구하기

윈도우 11에서 파일 탐색기 (Tom seki 😂)가 느려지는 증상이 있는데, 이를 다시 윈도우 10 버전으로 복구하는 방법이 있어서 소개하게 되었다. Step 1. 레지스트리 실행 검색창에 "실행"을 검색해서 실행 앱을 클릭한다. 실행 앱이 열리면 "regedit"을 입력하여 레지스트리 편집기 앱을 실행한다. Step 2. blocked 레지스트리 추가 편집기 상단 경로 입력칸에 다음의 경로를 복사하여 붙여넣는다. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions 다음의 항목 ("Shell Extensions" 폴더 우클릭 - 새로 만들기 - 키)을 선택하여 새로운 폴더를 생성하고, 키의 이름을 "Blocked"로..

C++ 뮤텍스 이중 lock 호출 문제 해결방안

[개요] C++로 작성된 회사 프로젝트에서 Onvif를 연동한 소스코드가 있는데, profileMutex, streamMutex 등의 뮤텍스를 사용하여 PTZ와 Onvif SDK를 사용하였다. 위의 각 PTZ 함수들이 모두 profileMutex를 잠근 후 사용하고 있는데, 문제는 뮤텍스를 사용하는 함수에서 또 뮤텍스를 사용하는 다른 함수를 호출하는 경우가 존재한다. 위 함수는 SetPreset() 함수인데, 처음에 profileMutex를 잠근 후에 아래에서 RemovePreset()을 호출하고, 다음에는 GetPresets()를 호출하고 있다. 이 코드는 그나마 리팩토링이 되어서 이중락이 발생하지 않도록 수정되었으나, 다른 함수들에서도 이런 경우가 발생할 여지가 높아보이도록 코드가 작성되었다. [개선..

C++ vs Node.js vs Go - 멀티스레드 퀵정렬 수행속도 비교

[실험환경] CPU : AMD Ryzen 7 1700 8-Core Processor Memory : 32.0 GB OS : Windows 10 Pro 데이터 개수 : 2천만개 ~ 3억 2천만개 스레드 개수 : 16개 값의 범위 : 0 ~ 1,000,000,000 [분석] 데이터 개수가 적을 때는 Node.js 가 가장 느린 성능을 보여주었으며, 데이터 개수가 증가함에 따라 Node.js가 Go를 제치고 더 빠른 성능을 보여주었다. Node.js는 멀티스레드를 사용하기 위해 worker_thread를 사용하는데, 각 스레드들이 수행할 작업이 적힌 스크립트 파일 (js)을 읽어서 수행하기 때문에 초반에 지연이 걸리게 되었다. 모든 경우에서 C++가 가장 빠른 속도를 보여주었다. 데이터 개수가 1억 6천만개 ..

컴퓨터 공학 2021.06.07

프로그래머스 가장 큰 수 구하기

문제 링크 [방법] 배열의 원소들을 순회하면서 가장 큰 자릿수를 구한다. 각 배열의 원소를 해당 크기의 자릿수만큼 늘리고, 자릿수가 변경되면서 생긴 자릿수 값은 해당 원소의 원본 값에서 가장 큰 자릿수의 값으로 할당한다. 예를 들어, 원소 41이 있고 가장 큰 자릿수가 3이라면 41을 414로 변경한다. 새로운 배열에 대해 내림차순으로 정렬하고, 같은 값을 가질 경우 원본 값에서 1의 자릿수 값을 비교하여 결정한다. 정렬된 배열의 원본 값을 순서대로 이어붙이면서 결과 값을 완성한다. [테스트 케이스] 41과 414가 주어졌을 때, 41441이 나와야 한다. 89와 898이 주어졌을 때, 89898이 나와야 한다. [소스코드] function solution(numbers) { let answer = ''..

백준 알고리즘 21738 얼음깨기 펭귄 C++ 코드

백준 알고리즘 링크 남극에 펭귄 한 마리와 크기와 모양이 동일한 N 개의 얼음 블록이 있습니다. 펭귄은 N개의 얼음 블록 중 한 곳 위에 서 있습니다. 펭귄이 서있는 얼음 블록 (이하 블록)을 기준으로 다른 블록들이 연결되어 있으며, 각 블록으로 이동할 수 있는 경로는 한 가지만 존재합니다. N개의 얼음 블록 중 M 개의 블록은 지지대 블록으로, 일반 블록들이 무너지지 않도록 지탱해주는 역할을 합니다. 일반 블록들은 지지대 블록이 하나라도 연결되어 있으면 무너지지 않습니다. 또한, 지지대 블록들 사이에 이동을 위해서는 반드시 펭귄이 서있는 블록 (이하 루트 블록)을 거쳐야 합니다. 또한, 루트 블록이 무너지지 않기 위해서는 지지대 블록이 반드시 두개 이상 연결되어 있어야 합니다. 또한, 루트 블록이 무너..

Node.js와 C++의 퀵정렬 속도 비교 (+메모리 할당 개선)

재귀 없는 퀵정렬을 JS와 C++로 구현하면서 수행속도를 측정하고자 하였다. C++은 정수형 타입이더라도 1바이트, 2바이트, 4바이트, 8바이트로 개발자가 선택하여 사용해야 하는 반면, JS는 정수형과 실수형 타입 모두 number로 사용되고 있다. 다만, JS의 경우 ArrayBuffer를 통해 원하는 바이트 크기의 버퍼를 생성할 수 있고, Int32Array() 함수로 해당 버퍼를 래핑하여 배열 원소의 크기를 4바이트로 사용할 수 있다. [기본 배열 사용시] JS에서 1억개 할당 시 기본 배열은 최대 6.8GB의 메모리 공간을 차지하였다. 정렬 시 시간은 13.452초 소요되었다. 메모리 할당 시간은 36.656초 소요되었다. [고정 크기 배열 사용시] JS에서 1억개 할당 시 고정 크기 배열은 4..

Node.js에서 기본 정렬 / 합병정렬 / 퀵정렬 속도 비교

실험환경 값의 범위 : 0~1억 데이터 개수 : 천만개 ~ 3천만개 반복횟수 : 3회 Note : 합병정렬은 기본 배열의 두배 크기로 메모리 공간을 사용합니다. 실험결과 1000만 1500만 2000만 2500만 3000만 기본정렬 4.16초 6.845초 9.142초 11.421초 14.021초 합병정렬 2.632초 3.881초 5.225초 6.589초 8.358초 퀵정렬 2.129초 3.172초 4.261초 5.487초 6.557초 /** INFO: 파라미터 만큼 배열을 생성하고 랜덤값 입력 */ function generateRandomArray(numData){ let arr = new Array(numData).fill(0); for(let i=0;i= high){ //INFO: 한개밖에 없으면 ..

Node.js 이벤트 루프 정리

[용어정의] REPL (Read-Eval-Print Loop) : 단일 사용자의 입력을 취하고 이를 평가 (실행)하고 결과를 사용자에게 반환시키는 단순한 상호작용 컴퓨터 프로그래밍 환경을 말한다. (예: 주피터 노트북) Polling : IT에서 클라이언트가 서버에게 주기적으로 요청을 보내는 방식을 말한다. [개요] 이벤트 루프가 각 단계에 진입하면 해당 단계에 한정된 작업을 수행하고 큐를 모두 소진하거나 콜백의 최대 개수를 실행하면 다음 단계로 넘어간다. [이벤트 루프 단계 요약] 타이머 (timers) : setTimeout()과 setInterval()로 스케줄링한 콜백을 실행한다. 대기콜백 (pending callbacks) : 다음 루프 반복으로 연기된 I/O 콜백들을 실행한다. 준비 (idle..

반응형