SlideShare uma empresa Scribd logo
1 de 37
High
Performanc
e
JavaScript
2013. 10. 12 김지한
= 어떻게 하면 조금 더 빠를까?

HighPerformance JavaScript

성능을 생각하는 자바스크립트
우리는 어떤 것을
‘성능이 좋다’고 하는가?
빠르다 가볍다
느리다 무겁다

기준이 뭔가요?
처리속도, 메모리 소비와 반환
화면의 깜빡임
사용자 행동에 대한 반응속도

 다 종합해서 ‘성능’
변수할당은 반복문 바깥에서
var a = [1,2,3,4];

var a = [1,2,3,4];
var test;
var len = a.length;

for(i=0; i<a.length; i++){
var test = 1;
}

for(i=0; i<len; i++){
test = i+1;
}
Closure 와는 비용을 비교해서
var a = [1,2,3,4,5,6];
var b;
a.forEach(function(n){
b = n % 2;
});

var a = [1,2,3,4,5,6];

<

a.forEach(function(n){
var b = n % 2;
});

http://jindo.dev.naver.com/jsMatch/?d=77&openResult=1
Scope는 가능한 적게
with(document){
var el = createElement("div");
}

꼭 필요한 경우가 아니면 with 구문 사용은
자제
Scope는 가능한 적게
var elDiv = htElement.htDivs.elDiv;
elDiv.innerHTML = ‚Hello World‛;

변수 Scope가 길어지면 로컬 변수로 캐시해서
사용
이 방법은 코드 압축시의 효과도 높여줍니다
정규식 선언은 한 번만
for(i=0; i<10; i++){
aLines[i] = aLines[i].replace(/.[r|n]+/, ‘’);
}

var rxCRLF = /.[r|n]+/;
for(i=0; i<10; i++){
aLines[i] = aLines[i].replace(rxCRLF, ‘’);
}
Selector 탐색 비용 최소화
getElementById
getElementsByTagName
getElementsByClassName

http://jindo.dev.naver.com/jsMatch/?d=86&openResult=1
Selector 탐색 비용 최소화
탐색 범위는 좁고 정확할 수록 좋
다

당연히 더 많은 범위를 찾을 때 더 오래 걸린
다
// jQuery
$(“.test”);
 $(“#container”).find(“.test”);
// JindoJS
$$(“.test”);
 $Element(“container”).queryAll(“.test”);
이벤트 핸들러는 영역 단위로
이벤트 핸들러는 메모리를 소모한다

 버블링(Bubbling)을 활용하자
이벤트 핸들러는 영역 단위로
<ul id=“list”>
<li class=“a”>a</li>
<li class=“b”>b</li>
</ul>
$(“.a”).click(function(){ … });
$(“.b”).click(function(){ … });
이벤트 핸들러는 영역 단위로
<ul id=“list”>
<li class=“a”>a</li>
<li class=“b”>b</li>
</ul>
$(“#list”).click(function(weEvt){
if($(weEvt.target).hasClass(“a”)){
…
}
});
이벤트 발생 순서
domready > load
touchstart > click
mousedown > click
 더 먼저 발생하는 이벤트를 활용할 수 있다면
그 이벤트를 활용하라
GC
GC(Garbage Collector)에 의해
제거되도록 하기 위해서는
사용하지 않는 것에 대해서는
참조를 유지하지 말아야 한다.
 사용하지 않는 참조를 null로!
쿠키? 로컬스토리지?
Cookie:
csrftoken=mRiN2QGk8kq9rfDOLTwVrtzPov0pLVhm;
__utma=45159731.192530165.1376983091.1376983091.13
80583980.2;
__utmz=45159731.1380583980.2.2.utmcsr=stackoverflow.c
om|utmccn=(referral)|utmcmd=referral|utmcct=/questio
ns/7085454/extract-keyphrases-from-text-1-4-wordngrams
 이런

세요

걸 매번 달고 다닌다고 생각해보
쿠키? 로컬스토리지?
HTTP 헤더도 다이어트가 필요합니
다
document.cookie
 window.localStorage
http://caniuse.com/namevalue-storage
네트워크 이야기 나온 김에…
네트워크 접속 횟수는 가능한 적
게!
HTTP Connection 할 때마다
기본적으로 소요되는 수백ms
무시 못 합니다 (특히 모바일)
문자열 합치기에는 배열 활용
var a = ‚‛;

var a = [];

for(i=0; i<10; i++){
a += ‚a‛;
}

for(i=0; i<10; i++){
a.push(‚a‛)
}

a.join(‚‛);

Array(11).join(‚a‛);

 무조건은 아니고, HTML 같이 긴 문자열 연산시!
less DOM Manipulation
DOM 조작 때 마다
브라우저는 화면을 새로 그리려고
한다

 깜빡임과 성능 저하의 주범
less DOM Manipulation
Repaint:
Element Visibility 변화시, 레이아웃 자체를 변화하지는 않는 경우
(outline, visibility, 배경색)
 DOM Tree 내에 존재하는 모든 노드의 Visibility 를
다 새로 검사하므로 상당히 비싼 작업

Reflow:
전체 페이지 자체의 레이아웃이 변화하는 경우
(appendChild, removeChild … )
less DOM Manipulation
<ul id=“list”></ul>
for(i=0;i<100;i++){
$(“#list”).append($(“<li>”).text(i));
}

http://jindo.dev.naver.com/jsMatch/?d=87&openResult=1
less DOM Manipulation
<ul id=“list”></ul>
var a = [];
for(i=0;i<100;i++){
a.push(“<li>” + i + “</li>”);
}
$(“#list”).html(a.join(“”));
http://jindo.dev.naver.com/jsMatch/?d=87&openResult=1
less DOM Manipulation
그러므로 …
여러분은 appendChild 보다
innerHTML 을 가까이 하는 것이 낫습니다
성능 측정, 비교 도구
jsMatch

http://jsmatch.com/

jsPerf

http://jsperf.com/
DynaTrace
http://www.compuware.com/en_us/application-performance-management/products/ajax-free-edition/overview.html

Yahoo! Yslow

http://developer.yahoo.com/yslow/
DynaTrace
http://www.compuware.com/en_us/application-performance-management/products/ajax-free-edition/overview.html

Yahoo! Yslow

http://developer.yahoo.com/yslow/
Chrome 개발자도구
결론
가랑비에 옷 젖는 줄 모른다
가늘게 내리는 비는 조금씩 젖어 들기 때문에 여간해서도 옷이 젖는 줄을 깨닫

지 못한다는 뜻으로, 아무리 사소한 것이라도 그것이 거듭되면 무시하지 못할
정도로크게 됨을 비유적으로이르는말 (국립국어원)
브라우저 마다 조금씩 다르고
같은 브라우저도 버전마다 조금씩 다르지만
중요한 건

이런 요소들을 고려하는 습관
감사합니다
Thank you

Mais conteúdo relacionado

Semelhante a [PHPFest 2013] High performance Javascript

온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Daejeon IT Developer Conference iBATIS2
Daejeon IT Developer Conference iBATIS2Daejeon IT Developer Conference iBATIS2
Daejeon IT Developer Conference iBATIS2plusperson
 
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...양 한빛
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint NAVER D2
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리Kenu, GwangNam Heo
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 
JVM Memory And GC Tuning Test
JVM Memory And GC Tuning Test JVM Memory And GC Tuning Test
JVM Memory And GC Tuning Test 승린 이
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02정출 김
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for JavaJonghwa Lee
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
파이썬과 케라스로 배우는 강화학습 저자특강
파이썬과 케라스로 배우는 강화학습 저자특강파이썬과 케라스로 배우는 강화학습 저자특강
파이썬과 케라스로 배우는 강화학습 저자특강Woong won Lee
 
Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Daum DNA
 
111 n grinder-deview_day1_track1_session_1_ver_2
111 n grinder-deview_day1_track1_session_1_ver_2111 n grinder-deview_day1_track1_session_1_ver_2
111 n grinder-deview_day1_track1_session_1_ver_2NAVER D2
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
[NEXT] Android Profiler
[NEXT] Android Profiler[NEXT] Android Profiler
[NEXT] Android ProfilerYoungSu Son
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 

Semelhante a [PHPFest 2013] High performance Javascript (20)

온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Daejeon IT Developer Conference iBATIS2
Daejeon IT Developer Conference iBATIS2Daejeon IT Developer Conference iBATIS2
Daejeon IT Developer Conference iBATIS2
 
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
JVM Memory And GC Tuning Test
JVM Memory And GC Tuning Test JVM Memory And GC Tuning Test
JVM Memory And GC Tuning Test
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for Java
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
파이썬과 케라스로 배우는 강화학습 저자특강
파이썬과 케라스로 배우는 강화학습 저자특강파이썬과 케라스로 배우는 강화학습 저자특강
파이썬과 케라스로 배우는 강화학습 저자특강
 
Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012Cassandra 멘붕기 | Devon 2012
Cassandra 멘붕기 | Devon 2012
 
111 n grinder-deview_day1_track1_session_1_ver_2
111 n grinder-deview_day1_track1_session_1_ver_2111 n grinder-deview_day1_track1_session_1_ver_2
111 n grinder-deview_day1_track1_session_1_ver_2
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
[NEXT] Android Profiler
[NEXT] Android Profiler[NEXT] Android Profiler
[NEXT] Android Profiler
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 

Último

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Último (6)

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

[PHPFest 2013] High performance Javascript