제로초의 강의 반복분 부분에서 i++ 와 i+=1은 나중에 깊게들어가면 다르다는걸 느끼실수있다고했다.
무엇이 다른가
++와 +=1 의 속도차이
2004.07.12 17:54
$i++ 과 $i+=1 은 $i를 1증가시키는 구문입니다.
과연 저 둘이 실제상황(?)에서 속도차이를 보일까 하는 의문에서
간단한 실험을 했습니다.
일단
for($i = 0; $i < 1000000; $i++); 와
for($i = 0; $i < 1000000; $i+=1); 를 따로 실행해서
마이크로초 단위로 실행시간을 계산해본 결과,
$i++ 일때
0.87869
0.859785
0.93886
0.882139
0.924311
0.872625
0.866393
0.890392
0.889265
0.866099
0.861506
0.880137
$i+=1 일때
0.928549
0.950968
0.995221
0.954347
0.941408
0.940832
0.957434
0.990631
0.936167
0.963263
0.966622
0.98165
백만번 루프에서 0.1초 이내의 차이가 나는것이 확인되었습니다.
아마도 파서에의해 번역될때,
++는 어셈블리 INC ecx 명령으로 번역되고,
+=1은 어셈블리 ADD ecx, 1 정도로 번역된다고 생각합니다.
저 둘의 처리 속도차이로 이와같은 결과가 생긴다고 생각되는군요. (;)
역시 크게 신경쓰문제는 아닐듯 합니다.
누군가가 ++보다 += 1을 선호하는 이유를 알고 싶다면 최근 Swift(iOS 프로그래밍용) 변경이 훌륭한 설명을 제공합니다.
Swift는 ++ 연산자를 완전히 없앴습니다. 다음은 Swift의 창시자인 Chris Latner가 인용한 이유입니다.
Goal
++와 += 1의 차이점을 파악한다.
Why? (주제 선정 이유)
프로그래머스 1단계 문제 중 '모의 고사'라는 문제를 해결하던 중
아래의 코드를 간결하게 만들고 싶었다.if (answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) { score[supozaNum] += 1; }
그런데 다음과 같은 문제가 발생했다.
// 얘는 되는데 (answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum]++; // 얘는 안된다. (answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum] += 1;
이 문제가 발생하는 원인에 대해 글을 적고 싶어서 주제를 선정했다.
++ 와 += 1의 차이
이 둘의 차이를 알기 위해서는 연산자들의 우선 순위를 알아야 한다.
우선순위연산자내용1 | ( ), [ ] | 괄호, 대괄호 |
2 | !, ~, ++, -- | 부정 / 증감 연산자 |
3 | *, /, % | 곱셈 / 나눗셈 연산자 |
4 | +, - | 덧셈 / 뺄셈 연산자 |
5 | <<, >>, >>> | 비트단위의 쉬프트 연산자 |
6 | <, <=, >, >= | 관계 연산자 |
7 | ==, != | |
8 | & | 비트단위의 논리 연산자 |
9 | ^ | |
10 | | | |
11 | && | 논리곱 연산자 |
12 | || | 논리합 연산자 |
13 | ?: | 조건 연산자 |
14 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, ~= | 대입 / 할당 연산자 |
보다시피 할당 연산자인 +=의 우선 순위가 가장 낮다.
때문에
(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum] += 1;
에서 && 연산이 += 보다 먼저 일어나기 때문에 오류가 발생한 것이다.
이 코드가 정상 작동하기 위해서는 score[supozaNum] += 1; 을 괄호로 묶어줘야 한다.
(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && (score[supozaNum] += 1);
번외
위와 비슷하게 우선순위로 인해 발생할 수 있는 몇몇 사례를 준비해봤다.
let a = 1;
const b = a++;
const c = ++a;
console.log(`a = ${a}, b = ${b}, c = ${c}`); // a = 3, b = 1, c = 3
/* a는 증감 연산자의 영향으로 2가 증가되어 3이 되었다.
b는 a++인데 증감 연산자가 피연산자의 뒤에 있기 때문에 b에는 1이 할당되고 이후에 a가 1증가한다.
c는 증감 연산자가 피연산자의 앞에 있기 때문에 c에는 a에서 1이 증가한 3이 할당된다.*/
let a = 1;
const b = 1 + ++a;
// 이 경우에는 증감 연산자가 먼저 실행된 후에 덧셈을 한다.
console.log(`a = ${a}, b = ${b}`); // a = 2, b = 3
++와 +=1 의 속도차이 - 웹마스터 팁 - XpressEngine
변수 $i를 가정하고 $i++ 과 $i+=1 은 $i를 1증가시키는 구문입니다. 과연 저 둘이 실제상황(?)에서 속도차이를 보일까 하는 의문에서 간단한 실험을 했습니다. 일단 for($i = 0; $i < 1000000; $i++); 와 for($i
xe1.xpressengine.com
https://velog.io/@alstnsrl98/%EC%99%80-1%EC%9D%98-%EC%B0%A8%EC%9D%B4
++와 += 1의 차이
\++와 += 1의 차이점을 파악한다.프로그래머스 1단계 문제 중 '모의 고사'라는 문제를 해결하던 중아래의 코드를 간결하게 만들고 싶었다. 그런데 다음과 같은 문제가 발생했다.이 문제가 발생하
velog.io
'javascript' 카테고리의 다른 글
forEach , map 알아보기 (0) | 2022.04.18 |
---|---|
textContent , innerText 차이 (0) | 2022.04.09 |
HTMLCollection vs NodeList (0) | 2022.04.01 |
프로미스(Promise)의 장점 (0) | 2022.03.28 |
자바스크립트 공백제거 (replace,trim) (0) | 2022.03.25 |