$30 off During Our Annual Pro Sale. View Details »

Leveraging Program Analysis to Reduce User-Perceived Latency in Mobile Applications

Leveraging Program Analysis to Reduce User-Perceived Latency in Mobile Applications

Presentation slides of the paper "Leveraging Program Analysis to Reduce User-Perceived Latency in Mobile Applications" at International Conference on Software Engineering (ICSE) 2018.

The presentation can be found at: https://youtu.be/8KUPsG4bByU

Yixue Zhao

May 30, 2018
Tweet

More Decks by Yixue Zhao

Other Decks in Research

Transcript

  1. Leveraging Program Analysis to Reduce
    User-Perceived Latency in Mobile Applications
    Yixue Zhao, Marcelo Schmitt Laser, Yingjun Lyu, and Nenad Medvidović
    University of Southern California
    May 30, 2018

    View Slide

  2. Motivating Example

    View Slide

  3. Motivating Example

    View Slide

  4. Motivating Example

    View Slide

  5. Motivating Example
    Latency!

    View Slide

  6. Motivating Example

    View Slide

  7. Motivating Example

    View Slide

  8. Outline
    • Existing prefetching techniques
    • Novel prefetching technique: PALOMA
    • Give me an example
    • How well does PALOMA do?
    • Summary & takeaways

    View Slide

  9. Existing Prefetching Techniques
    Existing approaches:
    • Server-based
    • Human-based
    • History-based
    • Domain-based

    View Slide

  10. Existing Prefetching Techniques
    Existing approaches:
    • Server-based à not accessible
    • Human-based
    • History-based
    • Domain-based

    View Slide

  11. Existing Prefetching Techniques
    Existing approaches:
    • Server-based à not accessible
    • Human-based à manual & error-prone
    • History-based
    • Domain-based

    View Slide

  12. Existing Prefetching Techniques
    Existing approaches:
    • Server-based à not accessible
    • Human-based à manual & error-prone
    • History-based à time-consuming
    • Domain-based

    View Slide

  13. Existing Prefetching Techniques
    Existing approaches:
    • Server-based à not accessible
    • Human-based à manual & error-prone
    • History-based à time-consuming
    • Domain-based à not general

    View Slide

  14. Novel Prefetching Technique: PALOMA
    • Server-based
    • Human-based
    • History-based
    • Domain-based
    Client-only
    Automatic
    No historical data
    Domain-independent

    View Slide

  15. Meet PALOMA J
    Program Analysis for Latency Optimization of Mobile Apps
    • Client-only
    • Automatic
    • No historical data
    • Domain-independent

    View Slide

  16. Key Insights
    • App code has useful information
    • “User think time” provides opportunities

    View Slide

  17. PALOMA in a Nutshell
    Code
    Analysis
    App
    Instrumentation
    Optimized
    App

    View Slide

  18. Original App Workflow
    Origin
    Server
    Latency!
    Original
    App
    • App interacts with server
    • Network latency

    View Slide

  19. PALOMA Workflow
    Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  20. PALOMA Workflow
    Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online
    “what”

    View Slide

  21. PALOMA Workflow
    Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online
    “when”

    View Slide

  22. PALOMA Workflow
    Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  23. PALOMA Workflow
    Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  24. Outline
    • Existing prefetching techniques
    • Novel prefetching technique: PALOMA
    Ø Give me an example
    • How well does PALOMA do?
    • Summary & takeaways

    View Slide

  25. Illustrating Example
    • Event app:
    1. choose city name

    View Slide

  26. Illustrating Example
    • Event app:
    1. choose city name
    2. click submit to get event
    information

    View Slide

  27. Illustrating Example
    • Event app:
    1. choose city name
    2. click submit to get event
    information

    View Slide

  28. Illustrating Example
    • Event app:
    1. choose city name
    2. click submit to get event
    information
    FINALE
    The original aesthetic and
    unconventional Do-it-Yourself
    attitude of the show creates a raw
    energy that simmers through a haze
    of confetti, smoke and pulsing lights.

    View Slide

  29. Illustrating Example
    • Event app:
    1. choose city name
    2. click submit to get event
    information
    • Objective:
    send event query before
    clicking submit button

    View Slide

  30. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }

    View Slide

  31. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }

    View Slide

  32. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }

    View Slide

  33. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }

    View Slide

  34. Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    PALOMA Workflow
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  35. String Analysis Callback Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    Answer “what” to prefetch
    * Yellow = terms defined in the paper

    View Slide

  36. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    Answer “what” to prefetch
    • Identify URL Spot
    * Yellow = terms defined in the paper
    Callback Analysis

    View Slide

  37. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    * Yellow = terms defined in the paper
    Callback Analysis

    View Slide

  38. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    * Yellow = terms defined in the paper
    Callback Analysis

    View Slide

  39. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    • Output à URL Map
    { url1: [ “http://event?&cityName=”, Line7] }
    * Yellow = terms defined in the paper
    Callback Analysis

    View Slide

  40. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    • Identify Target Callback
    * Yellow = terms defined in the paper
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    • Output à URL Map
    { url1: [ “http://event?&cityName=”, Line7] }
    Callback Analysis

    View Slide

  41. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    • Identify Target Callback
    • Extract Callback Control Flow Graph
    (CCFG)
    * Yellow = terms defined in the paper
    { url1: [ “http://event?&cityName=”, Line7] }
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    • Output à URL Map
    Callback Analysis

    View Slide

  42. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    • Identify Target Callback
    • Extract Callback Control Flow Graph
    (CCFG)
    • Identify Trigger Callback
    * Yellow = terms defined in the paper
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    • Output à URL Map
    { url1: [ “http://event?&cityName=”, Line7] }
    Callback Analysis

    View Slide

  43. String Analysis
    Static Analysis Phase
    Answer “when” to prefetch
    • Identify Target Callback
    • Extract Callback Control Flow Graph
    (CCFG)
    • Identify Trigger Callback
    • Output à Trigger Map
    { [ onCreate ]: [ url1 ] }
    { [ onItemSelected ]: [ url1 ] }
    * Yellow = terms defined in the paper
    Answer “what” to prefetch
    • Identify URL Spot
    • Static URL string value analysis
    Interpret concrete values
    • Dynamic URL string value analysis
    Identify Definition Spots
    • Output à URL Map
    { url1: [ “http://event?&cityName=”, Line7] }
    Callback Analysis

    View Slide

  44. Static Analysis Phase
    Push to Proxy
    Legend Optimized
    App
    Original
    App

    View Slide

  45. Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    PALOMA Workflow
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  46. Automatically enable prefetching
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests
    • Output à Optimized App
    App Instrumentation Phase
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  47. App Instrumentation Phase
    Automatically enable prefetching
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests
    • Output à Optimized App
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  48. { url1: [ “http://event?&cityName=”, Line7] }
    App Instrumentation
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 } 1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests
    Definition
    Spot

    View Slide

  49. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }
    App Instrumentation
    { url1: [ “http://event?&cityName=”, Line7] }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  50. App Instrumentation
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }

    View Slide

  51. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    18 }
    19 }
    App Instrumentation
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests
    Trigger
    Callback

    View Slide

  52. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    App Instrumentation
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  53. { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    App Instrumentation
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  54. App Instrumentation
    { [ onCreate ]: [ url1 ] } { [ onItemSelected ]: [ url1 ] }
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  55. App Instrumentation
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  56. App Instrumentation
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse(connection.getInputStream());
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  57. App Instrumentation
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    1. Update URL Map
    2. Trigger prefetching
    3. Redirect Requests

    View Slide

  58. Static Analysis App
    Instrumentation Optimized App
    String
    Analysis
    Callback
    Analysis
    PALOMA Workflow
    Original
    App
    Proxy
    Runtime
    Prefetching
    Origin
    Server
    offline online

    View Slide

  59. Proxy
    Runtime
    Prefetching
    Origin
    Server
    Optimized App
    PALOMA
    at runtime

    View Slide

  60. Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  61. Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  62. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  63. Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  64. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    Unknown
    Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  65. Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  66. Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  67. 1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    Runtime Prefetching Phase
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  68. Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    empty
    cache
    { url1: [ “http://event?&cityName=”, Line7] }

    View Slide

  69. Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    empty
    cache
    { url1: [ “http://event?&cityName=”, “Berlin”] }

    View Slide

  70. Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    empty
    cache
    { url1: [ “http://event?&cityName=”, “Berlin”] }

    View Slide

  71. Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }
    empty
    cache
    { url1: [ “http://event?&cityName=Berlin”] }

    View Slide

  72. url1’s
    response
    Runtime Prefetching Phase
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }

    View Slide

  73. Runtime Prefetching Phase
    url1’s
    response

    View Slide

  74. Runtime Prefetching Phase
    url1’s
    response
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }

    View Slide

  75. Runtime Prefetching Phase
    url1’s
    response
    1 class MainActivity{
    2 String cityName;
    3 protected void onCreate(){
    4 //register onItemSelected event
    5 cityNameSpinner.setOnItemSelectedListener(new View.OnItemSelectedListener(){
    6 public void onItemSelected() {
    7 cityName = cityNameSpinner.getSelectedItem().toString();
    sendDefinition(cityName, url1, 2);
    triggerPrefetch(url1);
    8 }});
    9 //register onClick event
    10 submitBtn.setOnClickListener(new View.OnClickListener(){
    11 public void onClick(){
    12 //initialize URL
    13 URL url1 = new URL("http://event?&cityName="+cityName);
    14 //send HTTP request
    15 URLConnection connection = url1.openConnection();
    16 Parse( fetchFromProxy(connection) );
    17 }});
    triggerPrefetch(url1);
    18 }
    19 }

    View Slide

  76. FINALE
    The original aesthetic and
    unconventional Do-it-Yourself
    attitude of the show creates a raw
    energy that simmers through a haze
    of confetti, smoke and pulsing lights.
    Runtime Prefetching Phase
    url1’s
    response

    View Slide

  77. Outline
    • Existing prefetching techniques
    • Novel prefetching technique: PALOMA
    • Give me an example
    Ø How well does PALOMA do?
    • Summary & takeaways

    View Slide

  78. Evaluation
    Objectives:
    • Accuracy
    Microbenchmark
    • Effectiveness
    Microbenchmark
    32 Market Apps

    View Slide

  79. Evaluation – Microbenchmark
    DS1,1
    1 - H
    DS1,1
    2 - NP
    DS1,2
    DS1,1
    DS1,1
    4 - NH
    DS1,2
    DS1,2
    5 - NP
    DS1,1
    DS2,1
    8 - NP
    DS1,1
    DS1,1
    6 - H
    DS2,1
    DS1,1
    7 - NP
    DS2,1 DS2,1
    DS1,1
    11 - NP
    DS2,2
    DS1,1
    15 - NP
    DS2,2
    DS2,1
    DS1,1
    DS2,1
    12 - NH
    DS2,2
    DS1,1
    13 - NP
    DS2,2
    DS2,1
    DS2,2
    DS1,1
    14 - NP
    DS2,1
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    19 - NP
    DS2,1
    DS1,2
    DS1,1
    17 - NP
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS1,1
    18 - NP
    DS2,2
    DS2,1
    DS1,2
    DS2,1
    22 - NP
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    DS2,1
    DS1,2
    DS1,1
    DS1,1
    24 - NH
    DS2,2
    DS2,1
    DS1,2
    DS1,2
    DS1,1
    DS2,1
    DS2,2
    DS1,1
    21 - NH
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    10 - H
    DS2,2
    DS2,1
    DS1,1
    DS2,2
    9 - NP
    3 - H
    16 - H
    20 - NP 23 - NH
    • 25 Test Cases
    # of dynamic values ≤ 2
    # of Definition Spots (DS) ≤ 2

    View Slide

  80. Evaluation – Microbenchmark
    DS1,1
    1 - H
    DS1,1
    2 - NP
    DS1,2
    DS1,1
    DS1,1
    4 - NH
    DS1,2
    DS1,2
    5 - NP
    DS1,1
    DS2,1
    8 - NP
    DS1,1
    DS1,1
    6 - H
    DS2,1
    DS1,1
    7 - NP
    DS2,1 DS2,1
    DS1,1
    11 - NP
    DS2,2
    DS1,1
    15 - NP
    DS2,2
    DS2,1
    DS1,1
    DS2,1
    12 - NH
    DS2,2
    DS1,1
    13 - NP
    DS2,2
    DS2,1
    DS2,2
    DS1,1
    14 - NP
    DS2,1
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    19 - NP
    DS2,1
    DS1,2
    DS1,1
    17 - NP
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS1,1
    18 - NP
    DS2,2
    DS2,1
    DS1,2
    DS2,1
    22 - NP
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    DS2,1
    DS1,2
    DS1,1
    DS1,1
    24 - NH
    DS2,2
    DS2,1
    DS1,2
    DS1,2
    DS1,1
    DS2,1
    DS2,2
    DS1,1
    21 - NH
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    10 - H
    DS2,2
    DS2,1
    DS1,1
    DS2,2
    9 - NP
    3 - H
    16 - H
    20 - NP 23 - NH
    • 25 Test Cases
    # of dynamic values ≤ 2
    # of Definition Spots (DS) ≤ 2
    • The location of DS
    Prefetchable
    Non Prefetchable (NP)
    Hit (H)
    Non Hit (NH)
    Trigger
    Point

    View Slide

  81. • 25 Test Cases
    # of dynamic values ≤ 2
    # of Definition Spots (DS) ≤ 2
    • The location of DS
    Evaluation – Microbenchmark
    DS1,1
    1 - H
    DS1,1
    2 - NP
    DS1,2
    DS1,1
    DS1,1
    4 - NH
    DS1,2
    DS1,2
    5 - NP
    DS1,1
    DS2,1
    8 - NP
    DS1,1
    DS1,1
    6 - H
    DS2,1
    DS1,1
    7 - NP
    DS2,1 DS2,1
    DS1,1
    11 - NP
    DS2,2
    DS1,1
    15 - NP
    DS2,2
    DS2,1
    DS1,1
    DS2,1
    12 - NH
    DS2,2
    DS1,1
    13 - NP
    DS2,2
    DS2,1
    DS2,2
    DS1,1
    14 - NP
    DS2,1
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    19 - NP
    DS2,1
    DS1,2
    DS1,1
    17 - NP
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS1,1
    18 - NP
    DS2,2
    DS2,1
    DS1,2
    DS2,1
    22 - NP
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    DS2,1
    DS1,2
    DS1,1
    DS1,1
    24 - NH
    DS2,2
    DS2,1
    DS1,2
    DS1,2
    DS1,1
    DS2,1
    DS2,2
    DS1,1
    21 - NH
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    10 - H
    DS2,2
    DS2,1
    DS1,1
    DS2,2
    9 - NP
    3 - H
    16 - H
    20 - NP 23 - NH
    Trigger
    Point
    Prefetchable
    Non Prefetchable (NP)
    Hit (H)
    Non Hit (NH)

    View Slide

  82. Evaluation – Microbenchmark
    DS1,1
    1 - H
    DS1,1
    2 - NP
    DS1,2
    DS1,1
    DS1,1
    4 - NH
    DS1,2
    DS1,2
    5 - NP
    DS1,1
    DS2,1
    8 - NP
    DS1,1
    DS1,1
    6 - H
    DS2,1
    DS1,1
    7 - NP
    DS2,1 DS2,1
    DS1,1
    11 - NP
    DS2,2
    DS1,1
    15 - NP
    DS2,2
    DS2,1
    DS1,1
    DS2,1
    12 - NH
    DS2,2
    DS1,1
    13 - NP
    DS2,2
    DS2,1
    DS2,2
    DS1,1
    14 - NP
    DS2,1
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    19 - NP
    DS2,1
    DS1,2
    DS1,1
    17 - NP
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS1,1
    18 - NP
    DS2,2
    DS2,1
    DS1,2
    DS2,1
    22 - NP
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    DS2,1
    DS1,2
    DS1,1
    DS1,1
    24 - NH
    DS2,2
    DS2,1
    DS1,2
    DS1,2
    DS1,1
    DS2,1
    DS2,2
    DS1,1
    21 - NH
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    10 - H
    DS2,2
    DS2,1
    DS1,1
    DS2,2
    9 - NP
    3 - H
    16 - H
    20 - NP 23 - NH
    Prefetchable
    Non Prefetchable (NP)
    Hit (H)
    Non Hit (NH)
    • 25 Test Cases
    # of dynamic values ≤ 2
    # of Definition Spots (DS) ≤ 2
    • The location of DS
    Trigger
    Point

    View Slide

  83. Evaluation – Microbenchmark
    DS1,1
    1 - H
    DS1,1
    2 - NP
    DS1,2
    DS1,1
    DS1,1
    4 - NH
    DS1,2
    DS1,2
    5 - NP
    DS1,1
    DS2,1
    8 - NP
    DS1,1
    DS1,1
    6 - H
    DS2,1
    DS1,1
    7 - NP
    DS2,1 DS2,1
    DS1,1
    11 - NP
    DS2,2
    DS1,1
    15 - NP
    DS2,2
    DS2,1
    DS1,1
    DS2,1
    12 - NH
    DS2,2
    DS1,1
    13 - NP
    DS2,2
    DS2,1
    DS2,2
    DS1,1
    14 - NP
    DS2,1
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    19 - NP
    DS2,1
    DS1,2
    DS1,1
    17 - NP
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    DS1,1
    18 - NP
    DS2,2
    DS2,1
    DS1,2
    DS2,1
    22 - NP
    DS2,2
    DS1,2
    DS1,1
    DS2,2
    DS2,1
    DS1,2
    DS1,1
    DS1,1
    24 - NH
    DS2,2
    DS2,1
    DS1,2
    DS1,2
    DS1,1
    DS2,1
    DS2,2
    DS1,1
    21 - NH
    DS2,1
    DS2,2
    DS1,2
    DS1,1
    10 - H
    DS2,2
    DS2,1
    DS1,1
    DS2,2
    9 - NP
    3 - H
    16 - H
    20 - NP 23 - NH
    • 25 Test Cases
    # of dynamic values ≤ 2
    # of Definition Spots (DS) ≤ 2
    • The location of DS
    Prefetchable
    Non Prefetchable (NP)
    Hit (H)
    Non Hit (NH)
    Trigger
    Point

    View Slide

  84. Evaluation – Microbenchmark
    Check out our paper!

    View Slide

  85. Evaluation – Microbenchmark
    • Accuracy
    Precision: 100% (All prefetched requests are prefetchable)
    Recall: 100% (All prefetchable requests are prefetched)

    View Slide

  86. Evaluation – Microbenchmark
    • Accuracy
    Precision: 100% (All prefetched requests are prefetchable)
    Recall: 100% (All prefetchable requests are prefetched)
    • Effectiveness
    Average latency reduction: 99.47% (across all Hit cases)
    Average overhead: 6.44ms (across all 25 cases)

    View Slide

  87. Evaluation – Market Apps
    • 32 subject apps from Google Play
    • 11 app categories
    • App size from 312 KB to 17.8 MB
    • 2 Android users exposed to all app options
    • 4G network setting

    View Slide

  88. Evaluation – Market Apps
    • Results across the 32 subject apps
    Min. Max. Avg. Std. Dev.
    Runtime
    Requests
    1 64 13.28 14.41
    Hit Rate 7.7% 100% 47.76% 28.81%
    Latency
    Reduction
    87.41% 99.97% 98.82% 2.3%

    View Slide

  89. Summary

    View Slide

  90. Summary
    Latency!

    View Slide

  91. Summary
    Latency!
    Latency! (Systems)

    View Slide

  92. Latency! (Systems)
    Summary
    Prefetching (Program Analysis)
    Latency!

    View Slide

  93. Takeaways
    Program Analysis for Latency Optimization in Mobile Apps:
    • Client-only
    • Automatic
    • Domain-independent
    • No historical data required

    View Slide

  94. Takeaways
    Program Analysis for Latency Optimization in Mobile Apps:
    • Significant latency reduction
    • Negligible overhead

    View Slide

  95. Takeaways
    Program Analysis for Latency Optimization in Mobile Apps:
    • Foundation
    • Rigorous formulation of prefetching scenarios
    • Comprehensive & reusable microbenchmark

    View Slide

  96. Behind the Scene: co-authors
    Marcelo Schmitt Laser Yingjun Lyu advisor: Nenad Medvidović

    View Slide

  97. Behind the Scene: co-authors + acknowledgement
    William G.J. Halfond Atanas (Nasko) Rountev Yuhao Zhu

    View Slide

  98. Contact: [email protected]
    PALOMA Website: softarch.usc.edu/PALOMA

    View Slide