AMP는 어떻게 빠른 성능을 내나.key

Similar documents
Ext JS À¥¾ÖÇø®ÄÉÀ̼ǰ³¹ß-³¹Àå.PDF

Building Mobile AR Web Applications in HTML5 - Google IO 2012

PowerPoint 프레젠테이션

Week8-Extra

Lab1

쉽게 풀어쓴 C 프로그래밍

Syrup Store O2O Marketing Platform/Solution

PowerPoint 프레젠테이션

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

<FEFF E002D B E E FC816B CBDFC1B558B202E6559E830EB C28D9>

#³óÃÌ°æÁ¦ 64È£-Ä®¶ó¸é

¾Èµ¿±³È¸º¸ÃÖÁ¾

¾Ë±â½¬¿îÀ±¸®°æ¿µc03ÖÁ¾š

Overall Process

Lab10

PowerPoint Presentation

쿠폰형_상품소개서

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

HTML5

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

HTML5가 웹 환경에 미치는 영향 고 있어 웹 플랫폼 환경과는 차이가 있다. HTML5는 기존 HTML 기반 웹 브라우저와의 호환성을 유지하면서도, 구조적인 마크업(mark-up) 및 편리한 웹 폼(web form) 기능을 제공하고, 리치웹 애플리케이 션(RIA)을

Jwplayer 요즘 웹에서 동영상 재생을 목적으로 많이 쓰이는 jwplayer의 설치와 사용하기 입니다. jwplayer홈페이지 : 위의 홈페이지에 가시면 JWplayer를 다운 받으실 수 있습니다. 현재 5.1버전

Macaron Cooker Manual 1.0.key

"Responsive web design" ( 우리회사웹사이트반응형으로리모델링하기 ) 정찬명

New Accord 3.5 V6 _ Modern Steel Metallic

김기남_ATDC2016_160620_[키노트].key

playnode.key

Dialog Box 실행파일을 Web에 포함시키는 방법

Modern Javascript

Voice Portal using Oracle 9i AS Wireless

Microsoft PowerPoint - aj-lecture1-HTML-CSS-JS.ppt [호환 모드]

Vostit Product Offerings

PowerPoint 프레젠테이션

C H A P T E R 2

3장

0311 Cube PPT_최종.pdf

µðÇÃ24-Ç¥Áö´Ü¸é

Health Essay 성경훈 대표원장의 척추 관절 전문의 고르는 법 척추 관절 질환, 의사를 잘 만나야 합니다 글 성경훈 21세기병원 대표원장 사진 백기광(스튜디오100) 환자에게 적극적으로 많이 질문하는 의사를 만나세요. 최소한 성의 있는 의사일 것입니다. 나아가

PCServerMgmt7

Portal_9iAS.ppt [읽기 전용]

Microsoft PowerPoint - web-part02-ch15-문서객체조작.pptx

미쓰리 파워포인트

Javascript

81-05.PDF

쉽게 풀어쓴 C 프로그래밍



sc family_12 내지_최종

야쿠르트2010 3월 - 최종

Javascript.pages

<65B7AFB4D7B7CEB5E5BCEEBFEEBFB5B0E1B0FABAB8B0EDBCAD5FC3D6C1BE2E687770>

OVERVIEW 디트라이브는 커뮤니케이션 환경의 다변화에 대응하기 위한 고객들의 다양한 욕구를 충족시키기 위해, TV광고부터 온라인 광고 및 프로모션과 웹사이트 구축은 물론 뉴미디어까지 아우르는 다양한 IMC 기능을 수행하는 마케팅 커뮤니케이션 회사입니다. 대표이사 설

HTML5


160322_ADOP 상품 소개서_1.0

Intro to Servlet, EJB, JSP, WS

Microsoft PowerPoint - CoolMessenger_제안서_라이트_200508

리포트_23.PDF

Prototype에서 jQuery로 옮겨타기

CMS-내지(서진이)

PowerPoint 프레젠테이션

슬라이드 1

Ÿ column-rule 속성은단사이의구분선을표현하기위한속성으로 column-rule-color, column-rule-style, column-rule-width 속성을한번에지정할수있다. 1.4 단의확장 Ÿ column-span 속성은다단을구성할때해당요소가얼마나많은단

Something that can be seen, touched or otherwise sensed

Microsoft PowerPoint - web-part01-ch10-문서객체모델.pptx

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

WEB HTML CSS Overview


이장에서다룰내용 테두리를제어하는스타일시트 외부여백 (Margin) 과내부여백 (Padding) 관련속성 위치관련속성 2

NATE CP 가이드 1. WML 페이지에서줄바꿈문제 개요 WML 페이지에서줄바꿈은명시적으로 <br/> 태그를사용하여야한다. 설명그림 2 의의도로제작된페이지에서 Card Styles 텍스트와 Select 박스사이에명시적인 <br/> 태그가없어, 그림 1 과같이줄바꿈이되



YSU_App_2.0-2

보광31호(4)

일반인을 위한 전자책 제작 방법

SK Telecom Platform NATE

포맷

동강바 반과람 자물과 를고구 꿈기름 꾸같 다이 소 중 한 風 02 letter from CEO... 이용재 한국투자밸류자산운용 대표이사 인사말 雲 Part 1 우리는 동반자, 더불어 함께 02 Life Partner 1... 함께 구르는 돌 소설가 조정래 시인 김초혜

슬라이드 1

SchoolNet튜토리얼.PDF

Microsoft PowerPoint - Chapter_04.pptx

2 보도 2013년 12월 16일 제15호 너희들 인도가면 고생좀 할거야 평소처럼 정신없는 최형은 기자의 정신없는 인도 평화여행 후기 인도 다녀왔다. 왠지 일어나면서부터 머리가 살짝 아팠다. 할머니가 사다주신 젤리 2통을 가방에 쑤셔 넣고 아빠 차에 실려 인천 공항으로

Multi Channel Analysis. Multi Channel Analytics :!! - (Ad network ) Report! -! -!. Valuepotion Multi Channel Analytics! (1) Install! (2) 3 (4 ~ 6 Page

JavaGeneralProgramming.PDF

국내 디지털콘텐츠산업의 Global화 전략

쉽게 풀어쓴 C 프로그래밍

2파트-07


Social Network

서현수

HTML5

* pb77¹¼úÀÇÇöÀå02š

제목을 입력하세요.

삼국통일시나리오.indd

Absolute Blue 태양의 위세 앞에서도 당당한 여자의 자존 심을 닮은 컬러. 바람을 닮아 유연한, 물을 닮아 자유롭게, 거칠 것 없이 여름의 클라 이맥스에 올라서서 세상을 물들이는 소리 없는 지배자, 블루

하둡을이용한파일분산시스템 보안관리체제구현


Transcription:

AMP는 어떻게 빠른 성능을 내나? AU개발 김태훈 kishu@navercorp.com

AMP 란무엇인가?

AMP 방식으로 HTML을 만들고 AMP JS를 로딩하고 AMP 컴포넌트만 사용하면 웹페이지의 빠른 렌더링을 보장 + 구글 검색 결과에서 즉시 로딩(빠르고 멋있게)

AMPs are just Web Pages!

AMPs are just Web Pages!

HELLO AMP!!! <!doctype html> <html amp lang="en"> <head> <meta charset="utf-8"> <title>hello, AMPs</title> <link rel="canonical" href="http://example.ampproject.org/article-metadata.html" /> <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"> <style amp-boilerplate>body{... }</style> <script async src="https://cdn.ampproject.org/v0.js"></script> </head> <body> <h1>welcome to the mobile web</h1> </body> </html>

AMP COMPONENTS /* AMP - */ <amp-img src="welcome.jpg" alt="welcome" height="400" width="800"></amp-img> /*AMP - */ <amp-video width=400 height=300 src="https://yourhost.com/videos/myvideo.mp4" poster="myvideo-poster.jpg"> </amp-video> amp-ad amp-embed amp-img amp-pixel amp-video

AMP EXTENDED COMPONENT /* AMP - */ <amp-carousel width=300 height=400> <amp-img src="my-img1.png" width=300 height=400></amp-img> <amp-img src="my-img2.png" width=300 height=400></amp-img> <amp-img src="my-img3.png" width=300 height=400></amp-img> </amp-carousel> /* AMP - */ <amp-youtube data-videoid="mgenrkrdogy" layout="responsive" width="480" height="270"></amp-youtube> amp-accordion amp-analytics amp-carousel amp-facebook amp-list amp-sidebar amp-youtube amp-mustache... 30 more

AMP STYLE <style amp-custom> /* any custom style goes here */ body { background-color: white; } amp-img { background-color: gray; border: 1px solid black; } </style>

AMP VALIDATION

AMP 벤치마킹 repository https://oss.navercorp.com/kishu/amp-prototype.git http://viewoss.navercorp.com/kishu/amp-prototype/blob/master/default.html http://viewoss.navercorp.com/kishu/amp-prototype/blob/master/video.html

AMP 벤치마킹이슈

AMP 벤치마킹 TIMELINE

AMP 벤치마킹 NETWORK

AMP 벤치마킹 NETWORK

HOW AMP SPEEDS UP PERFORMANCE

How AMP Speeds Up Performance

How AMP Speeds Up Performance

How AMP Speeds Up Performance

INSIDE OF AMP

AMP: CUSTOM ELEMENTS builtins/amp-img.js export function installimg(win) { registerelement(win, 'amp-img', AmpImg); } src/custom-element.js export function registerelement(win, name, implementationclass) { knownelements[name] = implementationclass; } win.document.registerelement(name, { prototype: createampelementproto(win, name), });

AMP: CUSTOM ELEMENTS BaseElement HTMLElement.prototype AmpImg ElementProto this.implementation_ = new AmpImg(); Custom Element AMP Components = HTML Custom Elements

AMP: CUSTOM ELEMENT Lifecycle Callbacks createdcallback attachedcallback detachedcallback attributechangedcallback

AMP: CUSTOM ELEMENT AMP's Extended Lifecycle Callbacks firstattachedcallback buildcallback layoutcallback viewportcallback documentinactivecallback

AMP: FSM(Finite-State Machine) OFF ON

AMP: FSM(Finite-State Machine)

AMP: FSM(Finite-State Machine) dopass = discoverwork + work applysizesandmediaquery calctaskscore measure peek schedulelayoutorpreload startlayout setinviewport

AMP: FSM(Finite-State Machine) discoverwork applysizesandmediaquery measure schedulelayoutorpreload setinviewport

AMP: FSM(Finite-State Machine) work calctaskscore peek startlayout

AMP: SINGLE PASS PROCESS class Pass { constructor(win, handler, opt_defaultdelay) { this.handler_; this.defaultdelay_; this.scheduled_; this.nexttime; this.running_; } ispending(); schedule(opt_delay); cancel(); } new Pass(this.win, () => this.dopass_()); let nextpassdelay = (now - this.exec_.getlastdequeuetime()) * 2; nextpassdelay = Math.max(Math.min(30000, nextpassdelay), 5000);

AMP: PROMISE

AMP: OPTIMIZATION REFLOW

AMP: OPTIMIZATION REFLOW

AMP: OPTIMIZATION REFLOW

AMP: OPTIMIZATION REFLOW // measure - ( ) var h1 = element1.clientheight; // mutate - element1.style.height = (h1 * 2) + 'px'; // measure - var h2 = element2.clientheight; // mutate - element2.style.height = (h2 * 2) + 'px'; // measure - var h3 = element3.clientheight; // mutate - element3.style.height = (h3 * 2) + 'px';

AMP: OPTIMIZATION REFLOW // measure var h1 = element1.clientheight; //( ) var h2 = element2.clientheight; // var h3 = element3.clientheight; // // mutate element1.style.height = (h1 * 2) + 'px'; // element2.style.height = (h2 * 2) + 'px'; // element3.style.height = (h3 * 2) + 'px'; //

NO batching DOM read/write operations

batching DOM read/write operations

AMP: OPTIMIZATION REFLOW class Vsync {.... mutate(mutator) {... } measure(measurer) {... } run(task, opt_state) {... }.... }

AMP: OPTIMIZATION REFLOW for (let i = 0; i < tasks.length; i++) { if (tasks[i].measure) { tasks[i].measure(states[i]); } } for (let i = 0; i < tasks.length; i++) { if (tasks[i].mutate) { tasks[i].mutate(states[i]); } }

AMP: OPTIMIZATION REFLOW

AMP: CONCLUSION

THANK YOU