Top Banner
Analyzing the Performance of Mobile Web: Challenges and Techniques ARIYA HIDAYAT ENGINEERING DIRECTOR
55

Analyzing the Performance of Mobile Web

Apr 24, 2015

Download

Technology

Ariya Hidayat

Presented at Velocity Conference, June 14, 2011
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Analyzing the Performance of Mobile Web

Analyzing the Performance of Mobile Web:

Challenges and Techniques

ARIYA HIDAYATENGINEERING DIRECTOR

Page 2: Analyzing the Performance of Mobile Web

whoami

Page 3: Analyzing the Performance of Mobile Web

Going Under the Hood

Page 4: Analyzing the Performance of Mobile Web

MyOwnSlow

Page 5: Analyzing the Performance of Mobile Web

Overview

Page 6: Analyzing the Performance of Mobile Web

Performance Areas

Network

Graphics

JavaScript

Page 7: Analyzing the Performance of Mobile Web

Desktop Tools

Firebug

Web Inspector

dynaTrace

Speed Tracer

Page Speed

YSlowBlaze.io

WebPageTestpcapperf

WebMetrics

Page 8: Analyzing the Performance of Mobile Web

Mobile Situation

Metrics•framerate•bytes transferred•caching•cookies•cache manifest•code size•execution speed

Network Variances2G, EDGE, 3G, 4G, LTE, ...

Continous Integration

Page 9: Analyzing the Performance of Mobile Web

“Too Many Phones Will Kill You...”

Page 10: Analyzing the Performance of Mobile Web

Stake Holders

Browser vendors

Web Site Developers

Application Developers

ServiceProvider

Page 11: Analyzing the Performance of Mobile Web

Approaches

Inject instrumentation

Read the source code

Proxy

High-speed Camera

Intrusive Emulation Observation

Benchmark

RF Monitor

Remote inspection

Page 12: Analyzing the Performance of Mobile Web

Strategies

1 Replicate and/or analyze on desktop

2 Tweak and insert instrumentation

Reducing complexity

System level

Page 13: Analyzing the Performance of Mobile Web

Caveats

Concept

Focus

Page 14: Analyzing the Performance of Mobile Web

Tools of Trade

Nexus One Gingerbread

http://source.android.com/source/building-devices.html

Page 15: Analyzing the Performance of Mobile Web

Headless WebKit

http://www.phantomjs.org https://github.com/ariya/phantomjs

“Full web stack.No browser required”

Page 17: Analyzing the Performance of Mobile Web

Di!erent WebKit “Ports”WebCore graphics

MaciOS

ChromiumAndroid Qt Gtk

CoreGraphics

Skia

QPainter

Cairo

graphics stack

GraphicsContext

Page 18: Analyzing the Performance of Mobile Web

Network

Page 19: Analyzing the Performance of Mobile Web

“Understanding Mobile Web Browser Performance”Rajiv Vijayakumar (Qualcomm)

Wed 2:40 pm, Ballroom ABCD

Page 20: Analyzing the Performance of Mobile Web

Web Inspector Network

Page 21: Analyzing the Performance of Mobile Web

HTTP Archive (HAR)

http://www.softwareishard.com/blog/har-12-spec/

Page 22: Analyzing the Performance of Mobile Web

Automating Network Sni"ng (Desktop)

phantomjs netsniff.js http://m.bing.com

Visualize using online HAR viewer

Page 23: Analyzing the Performance of Mobile Web

Android WebKit + Network Stack

WebView

libwebcore

Java

C++

Browser

Java

JNI

Network Stack Java

Page 24: Analyzing the Performance of Mobile Web

Real-time Sni"ng + Postprocessing

waiting data transfer

WebCoreResourceLoader::Finished()

WebCoreResourceLoader::AddData(...)WebFrame::startLoadingResource

Page 25: Analyzing the Performance of Mobile Web

06-12 22:57:48.430 D/webcoreglue( 1357): startLoadingResource NETWORK 0x66d368 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.710 D/webcoreglue( 1357): ReceivedResponse NETWORK handle=0x66d368 mimeType=text/html url=http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.780 D/webcoreglue( 1357): startLoadingResource NETWORK 0x6a8678 http://en.m.wikipedia.org/stylesheets/android.css06-12 22:57:48.780 D/webcoreglue( 1357): startLoadingResource NETWORK 0x6ab388 http://en.m.wikipedia.org/javascripts/jquery.js06-12 22:57:48.790 D/webcoreglue( 1357): startLoadingResource NETWORK 0x6ab7e8 http://en.m.wikipedia.org/javascripts/application.js06-12 22:57:48.790 D/webcoreglue( 1357): AddData NETWORK 0x66d368 4162 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.790 D/webcoreglue( 1357): AddData NETWORK 0x66d368 8192 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.790 D/webcoreglue( 1357): AddData NETWORK 0x66d368 1361 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.980 D/webcoreglue( 1357): AddData NETWORK 0x66d368 8192 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:48.980 D/webcoreglue( 1357): AddData NETWORK 0x66d368 803 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:49.000 D/webcoreglue( 1357): AddData NETWORK 0x66d368 4702 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:49.000 D/webcoreglue( 1357): AddData NETWORK 0x66d368 4507 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:49.020 D/webcoreglue( 1357): AddData NETWORK 0x66d368 8192 http://en.m.wikipedia.org/wiki/Orchid06-12 22:57:49.050 D/webcoreglue( 1357): AddData NETWORK 0x66d368 6750 http://en.m.wikipedia.org/wiki/Orchid

Example: Orchidadb logcat -v time | grep NETWORK

Page 26: Analyzing the Performance of Mobile Web

Example: Orchid

Page 27: Analyzing the Performance of Mobile Web

Going O#ine: Cache Manifest

https://github.com/jamesgpearce/confess

phantomjs confess.js http://functionsource.com

Automatic localstorage optimization

Page 28: Analyzing the Performance of Mobile Web

Graphics

Page 29: Analyzing the Performance of Mobile Web

Drawing Command Analysis

GraphicsContext

WebCore graphics

Skia

Log file

Page 30: Analyzing the Performance of Mobile Web

Example: BingplatformInitsavePlatformStatetranslate 0,0translate 0,0clip 1,0 0x6.95322e-310fillRect 0,0 800x556 color ff ff ff ffrestorePlatformStateplatformDestroyplatformInitsavePlatformStatetranslate 0,0translate 0,0clip 1,0 0x6.95322e-310fillRect 0,0 800x556 color ff ff ff ffrestorePlatformStateplatformDestroyplatformInitsavePlatformStatetranslate 0,0translate 0,0clip 1,0 0x6.95322e-310fillRect 0,0 800x556 color ff ff ff fffillRect 0,0 800x556 color ff ff ff ff

Page 31: Analyzing the Performance of Mobile Web

Painting Traces

Page 32: Analyzing the Performance of Mobile Web

Display List Approach

GraphicsContext

WebKit

Skia

“SkPicture”

no overhead anymore

Page 33: Analyzing the Performance of Mobile Web

How Fast is the “Playback”?#include "TimeCounter.h"

bool WebViewCore::drawContent(SkCanvas* canvas, SkColor){ uint32_t timestamp = getThreadMsec();

.... painting code .... DBG_SET_LOGD("% ms", getThreadMsec() - timestamp);}

external/webkit/WebKit/android/jni/WebViewCore.cpp

Page 34: Analyzing the Performance of Mobile Web

Example: Google News

16:24:04.070 D/webcoreglue(  273): drawContent 11 ms16:24:04.110 D/webcoreglue(  273): drawContent 13 ms16:24:04.150 D/webcoreglue(  273): drawContent 13 ms16:24:04.190 D/webcoreglue(  273): drawContent 10 ms16:24:04.240 D/webcoreglue(  273): drawContent 10 ms16:24:04.280 D/webcoreglue(  273): drawContent 13 ms16:24:04.320 D/webcoreglue(  273): drawContent 13 ms16:24:04.360 D/webcoreglue(  273): drawContent 13 ms16:24:06.080 D/webcoreglue(  273): drawContent 12 ms16:24:06.140 D/webcoreglue(  273): drawContent 10 ms16:24:06.180 D/webcoreglue(  273): drawContent 13 ms16:24:06.230 D/webcoreglue(  273): drawContent 14 ms16:24:06.600 D/webcoreglue(  273): drawContent 26 ms16:24:06.640 D/webcoreglue(  273): drawContent 13 ms16:24:06.860 D/webcoreglue(  273): drawContent 33 ms16:24:06.890 D/webcoreglue(  273): drawContent 12 ms16:24:06.930 D/webcoreglue(  273): drawContent 13 ms16:24:06.960 D/webcoreglue(  273): drawContent 13 ms16:24:07.000 D/webcoreglue(  273): drawContent 13 ms

adb logcat -v time | grep drawContent

Page 35: Analyzing the Performance of Mobile Web

How Much is the Frame Rate?bool WebViewCore::drawContent(SkCanvas* canvas, SkColor color){ static uint32_t frame_ref = 0; static int frame_tick = 0;

... painting code ...

frame_tick++; if (frame_tick >= 10) { DBG_SET_LOGD("framerate %d fps", (int)(frame_tick * 1000 / (1 + getThreadMsec() - frame_ref))); frame_tick = 0; frame_ref = getThreadMsec(); }}

Page 36: Analyzing the Performance of Mobile Web

Site Mirroring

https://github.com/ariya/X2 network/netspiegel

Proxy

Intertubes

port 8080SQLite DB

Mirror

port 8081

Page 37: Analyzing the Performance of Mobile Web

JavaScript

Page 39: Analyzing the Performance of Mobile Web
Page 40: Analyzing the Performance of Mobile Web

Garbage Collectorbool Heap::CollectGarbage(int requested_size, AllocationSpace space){ .. some code ... PerformGarbageCollection(space, collector, &tracer); LOGD("PerformGarbageCollection %d", requested_size);

.. some code ...}

external/v8/src/heap.cc

Page 41: Analyzing the Performance of Mobile Web

Example: Travelmate

06-13 13:24:36.470 D/v8      (  532): PerformGarbageCollection 2006-13 13:24:36.630 D/v8      (  532): PerformGarbageCollection 3278806-13 13:24:36.740 D/v8      (  532): PerformGarbageCollection 11606-13 13:24:36.810 D/v8      (  532): PerformGarbageCollection 8806-13 13:24:36.870 D/v8      (  532): PerformGarbageCollection 5206-13 13:24:37.000 D/v8      (  532): PerformGarbageCollection 2006-13 13:24:37.090 D/v8      (  532): PerformGarbageCollection 2406-13 13:24:37.450 D/v8      (  532): PerformGarbageCollection 3588406-13 13:24:39.400 D/v8      (  532): PerformGarbageCollection 2006-13 13:24:39.730 D/v8      (  532): PerformGarbageCollection 3392

adb logcat -v time | grep GarbageCollection

Page 42: Analyzing the Performance of Mobile Web

Keyword vs Identifier

instanceof instanceComponent

requires checking 9 chars

a g h j k l m o p q x y z

Page 43: Analyzing the Performance of Mobile Web

Function Parsing

foobar = function(x, y, z){....}

foobar(x, y, z);

Analyze the syntaxMark the position of

function ‘foobar’

Compile and run the function ‘foobar’

Page 44: Analyzing the Performance of Mobile Web

Static Code Analysishammerjs --syntax source-file.js

https://github.com/senchalabs/hammerjs

JSON syntax tree

Reflect.parse(code)

Page 45: Analyzing the Performance of Mobile Web

Syntax Tree

Variable Declaration

IdentifierLiteral Constant

answer 42

var answer = 42;keyword equal sign

identifier number

Page 46: Analyzing the Performance of Mobile Web

"type": "IfStatement","test": { "type": "BinaryExpression", "operator": "==", "left": { "type": "Identifier", "name": "x" }, "right": { "type": "Identifier", "name": "y" } }, "consequent": { "type": "ExpressionStatement", "expression": { "type": "CallExpression", "callee": { "type": "Identifier", "name": "foo" }, "arguments": [] } }, "alternate": null

if (x == y) foo();

Danger!

Page 47: Analyzing the Performance of Mobile Web

Deploy-time Pruning

function createList(position, options) { ... some code ... }

createList({ x: 0, y: 0});createList({ x: 0, y: 100});

Never used

Page 48: Analyzing the Performance of Mobile Web

Avoid Object Construction

startTime = new Date();// heavy processingelapsed = (new Date()) - startTime;

startTime = Date.now();// heavy processingelapsed = Date.now() - startTime;

Create + Destroy

Page 49: Analyzing the Performance of Mobile Web

Irrelevant Platforms

if (typeof object.attachEvent !== 'undefined') { // Internet Explorer < 9 object.attachEvent('on'+ev, createWrapper(func));} else { // DOM Level 3 object.addEventListener(ev, func);}

Does not apply in Mobile

Page 50: Analyzing the Performance of Mobile Web

User Interactions

Page 51: Analyzing the Performance of Mobile Web

Event Recorder & Player

http://www.sencha.com/blog/event-recorder-for-android-web-applications/

Page 52: Analyzing the Performance of Mobile Web

Conclusion

Page 53: Analyzing the Performance of Mobile Web

Today

Replicate and analyze on desktop

Find, look at, and understand the source code

Tweak at the system level + post-processing

Page 54: Analyzing the Performance of Mobile Web

Future

More built-in instrumentation

Remote inspection

API for test automation

Page 55: Analyzing the Performance of Mobile Web

THANK YOU!

[email protected]

@ariyahidayat

ariya.blogspot.com