Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Eliminating Code Overhead (Square HQ 2015)

Eliminating Code Overhead (Square HQ 2015)

The CPU, RAM, and disk are finite resources that are often taken for granted as unbounded. Not only is this obviously untrue, but the use of these resources directly affects the most important resource on a mobile device: the battery. This talk will focus on techniques that both libraries and applications can implement to ensure their effect is in general without overhead.

Video: https://youtu.be/b6zKBZcg5fk

Jake Wharton
PRO

June 25, 2015
Tweet

More Decks by Jake Wharton

Other Decks in Programming

Transcript

  1. Eliminating Code Overhead
    Jake Wharton

    View Slide

  2. CPU

    View Slide

  3. Memory
    CPU

    View Slide

  4. Memory
    CPU
    I/O

    View Slide

  5. Memory
    CPU
    I/O
    Battery

    View Slide

  6. Battery
    Memory
    CPU
    I/O

    View Slide

  7. Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  8. Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  9. Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  10. Battery
    Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  11. Battery
    Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  12. Battery
    Battery
    Battery
    Memory
    CPU
    I/O

    View Slide

  13. Memory
    CPU
    I/O

    View Slide

  14. Memory
    CPU
    I/O

    View Slide

  15. • Do not nest multi-pass layouts
    • Lazily compute complex data when needed
    • Cache heavy computational results for re-use
    • Consider RenderScript for performance
    • Keep work off of the main thread
    Memory
    CPU
    I/O

    View Slide

  16. • Use object pools and caches to reduce churn
    • Be mindful of the overhead of enums
    • Do not allocate inside the draw path
    • Use specialized collections instead of JDK
    collections when appropriate (SparseArray)
    Memory
    CPU
    I/O

    View Slide

  17. Memory
    CPU
    I/O
    • Batch operations with reasonable back-off
    policies
    • Use gzip or binary serialization format
    • Cache data offline with TTLs for reloading
    • Use JobScheduler API to batch across OS

    View Slide

  18. I/O
    Memory
    CPU
    What's next after macro?

    View Slide

  19. I/O
    Memory
    CPU
    What's next after macro?
    • Move on to so-called micro

    View Slide

  20. I/O
    Memory
    CPU
    What's next after macro?
    • Move on to so-called micro
    • Spectrum of optimizations, not binary

    View Slide

  21. I/O
    Memory
    CPU
    What's next after macro?
    • Move on to so-called micro
    • Spectrum of optimizations, not binary
    • Do not blindly apply to everything, only when appropriate

    View Slide

  22. I/O
    Memory
    CPU
    What's next after macro?
    • Move on to so-called micro
    • Spectrum of optimizations, not binary
    • Do not blindly apply to everything, only when appropriate
    • Multiple micro-optimizations can improve like a macro

    View Slide

  23. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  24. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  25. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  26. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  27. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  28. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  29. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  30. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  31. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  32. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  33. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  34. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  35. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  36. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  37. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  38. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  39. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  40. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  41. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  42. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  43. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  44. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  45. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  46. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  47. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  48. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  49. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  50. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  51. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  52. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  53. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  54. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  55. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  56. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  57. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  58. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  59. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  60. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  61. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  62. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  63. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  64. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  65. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  66. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  67. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  68. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  69. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  70. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  71. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  72. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  73. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  74. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  75. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }

    return unmodifiableList(names);

    }

    View Slide

  76. public List names(List users) {

    List names = new ArrayList<>();

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  77. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  78. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  79. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  80. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  81. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  82. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  83. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  84. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  85. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  86. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty

    View Slide

  87. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty

    View Slide

  88. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty

    View Slide

  89. Jimmy•McNulty
    public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  90. Jimmy•McNulty
    public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•

    View Slide

  91. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•
    Jimmy•McNulty,•

    View Slide

  92. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  93. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  94. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  95. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  96. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  97. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Stringer•Bell
    Jimmy•McNulty,•

    View Slide

  98. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell

    View Slide

  99. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell

    View Slide

  100. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell

    View Slide

  101. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  102. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  103. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  104. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  105. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  106. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  107. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  108. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•

    View Slide

  109. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland

    View Slide

  110. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland

    View Slide

  111. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland

    View Slide

  112. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland,•

    View Slide

  113. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland,•

    View Slide

  114. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland,•
    Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland,•D'Angelo•Barksdale

    View Slide

  115. Jimmy•McNulty,•Stringer•Bell,•Bunk•Moreland,•D'Angelo•Barksdale
    public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  116. public String names(List users) {

    StringBuilder builder = new StringBuilder();

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  117. public String names(List users) {

    int avg = 17; // Determined by exact science.

    StringBuilder builder = new StringBuilder(avg * users.size());

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  118. public String names(List users) {

    int avg = 17; // Determined by exact science.

    StringBuilder builder = new StringBuilder(avg * users.size());

    for (User user : users) {

    if (builder.length() > 0) builder.append(", ");

    builder.append(user.name);

    }X

    return builder.toString();

    }X

    View Slide

  119. for (int x = 0; x < valueCount; x++) {

    cleanFiles[x] = new File(directory, key + "." + x);

    dirtyFiles[x] = new File(directory, key + "." + x + ".tmp");

    }X

    View Slide

  120. for (int x = 0; x < valueCount; x++) {

    StringBuilder b1 = new StringBuilder();

    b1.append(key);

    b1.append(".");

    b1.append(x);

    cleanFiles[x] = new File(directory, b1.toString());

    StringBuilder b2 = new StringBuilder();

    b2.append(key);

    b2.append(".");

    b2.append(x);

    b2.append(".tmp");

    dirtyFiles[x] = new File(directory, b2.toString());

    }X

    View Slide

  121. for (int x = 0; x < valueCount; x++) {

    StringBuilder b1 = new StringBuilder();

    b1.append(key);

    b1.append(".");

    b1.append(x);

    cleanFiles[x] = new File(directory, b1.toString());

    StringBuilder b2 = new StringBuilder();

    b2.append(key);

    b2.append(".");

    b2.append(x);

    b2.append(".tmp");

    dirtyFiles[x] = new File(directory, b2.toString());

    }X

    View Slide

  122. for (int x = 0; x < valueCount; x++) {

    StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  123. for (int x = 0; x < valueCount; x++) {

    StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  124. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  125. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  126. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  127. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());

    }X

    View Slide

  128. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  129. StringBuilder b = new StringBuilder();

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  130. StringBuilder b = new StringBuilder(key.length() + 6);

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  131. StringBuilder b = new StringBuilder(key.length() + 6);

    b.append(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  132. StringBuilder b = new StringBuilder(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  133. StringBuilder b = new StringBuilder(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  134. StringBuilder b = new StringBuilder(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    public StringBuilder(String str)
    Constructs a string builder initialized to the contents of the specified string.
    The initial capacity of the string builder is 16 plus the length of the string
    argument.

    View Slide

  135. StringBuilder b = new StringBuilder(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    public StringBuilder(String str)
    Constructs a string builder initialized to the contents of the specified string.
    The initial capacity of the string builder is 16 plus the length of the string
    argument.

    View Slide

  136. StringBuilder b = new StringBuilder(key);

    b.append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());

    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  137. StringBuilder b = new StringBuilder(key).append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());
    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X
    public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  138. private int headerOffset;

    private int headerTop;

    private int animationHeight;


    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);


    setTitle(getResources().getString(R.id.title));

    getWindow().setStatusBarColor(getResources().getColor(R.color.blue));


    headerOffset = getResources()
    .getDimensionPixelSize(R.dimen.header_offset);

    headerTop = getResources()
    .getDimensionPixelSize(R.dimen.header_top);

    animationHeight = getResources()
    .getDimensionPixelSize(R.dimen.animation_height);

    }X

    View Slide

  139. private int headerOffset;

    private int headerTop;

    private int animationHeight;


    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();


    setTitle(getResources().getString(R.id.title));

    getWindow().setStatusBarColor(getResources().getColor(R.color.blue));


    headerOffset = getResources()
    .getDimensionPixelSize(R.dimen.header_offset);

    headerTop = getResources()
    .getDimensionPixelSize(R.dimen.header_top);

    animationHeight = getResources()
    .getDimensionPixelSize(R.dimen.animation_height);

    }X

    View Slide

  140. private int headerOffset;

    private int headerTop;

    private int animationHeight;


    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();


    setTitle(res.getString(R.id.title));

    getWindow().setStatusBarColor(res.getColor(R.color.blue));


    headerOffset = res.getDimensionPixelSize(R.dimen.header_offset);

    headerTop = res.getDimensionPixelSize(R.dimen.header_top);

    animationHeight = res.getDimensionPixelSize(R.dimen.animation_height);

    }X

    View Slide

  141. private int headerOffset;

    private int headerTop;

    private int animationHeight;


    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();


    setTitle(res.getString(R.id.title));

    getWindow().setStatusBarColor(res.getColor(R.color.blue));


    headerOffset = res.getDimensionPixelSize(R.dimen.header_offset);

    headerTop = res.getDimensionPixelSize(R.dimen.header_top);

    animationHeight = res.getDimensionPixelSize(R.dimen.animation_height);

    }

    View Slide

  142. public boolean validIndices(int[] indices, String string) {

    for (int index : indices) {

    if (index < 0 && index >= string.length()) {

    return false;

    }X

    }X

    return true;

    }X

    View Slide

  143. public boolean validIndices(int[] indices, String string) {

    int len = string.length();

    for (int index : indices) {

    if (index < 0 && index >= len) {

    return false;

    }X

    }X

    return true;

    }X

    View Slide

  144. public boolean validIndices(int[] indices, String string) {

    int len = string.length();

    for (int index : indices) {

    if (index < 0 && index >= len) {

    return false;

    }X

    }X

    return true;

    }X

    View Slide

  145. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  146. public boolean firstShorterThan(List strings, int max) {

    int i = 0;

    while (i < strings.size()) {X

    if (strings.get(i).length() > max) {Y

    return i;

    }X

    i++;

    }X

    return -1;

    }X

    View Slide

  147. public boolean firstShorterThan(List strings, int max) {

    int i = 0;

    while (true) {X

    if (!(i < strings.size())) {

    break;

    }Y

    if (strings.get(i).length() > max) {Y

    return i;

    }X

    i++;

    }X

    return -1;

    }X

    View Slide

  148. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0;ciyif (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  149. public boolean firstShorterThan(List strings, int max) {

    int size =sstrings.size();
    for (int i = 0;ciy< size;xi++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  150. public boolean firstShorterThan(List strings, int max) {

    int size =sstrings.size();
    for (int i = 0;ciy< size;xi++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  151. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0, size = strings.size();ciy< size;xi++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  152. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0, size = strings.size();ciy< size;xi++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    View Slide

  153. View Slide

  154. invokestatic
    static methods

    View Slide

  155. invokestatic
    static methods
    class Test {

    public static void main(String... args) {

    staticMethod();

    }

    public static void staticMethod() {

    System.out.println("Hello, static method!");

    }

    }

    View Slide

  156. invokestatic
    static methods
    public static void main(java.lang.String...);
    Code:
    0: invokestatic #2 // Method staticMethod:()V
    3: return

    View Slide

  157. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods

    View Slide

  158. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    Test();
    Code:
    0: aload_0
    1: invokespecial #1 // Method java/lang/Object."":()V
    4: return

    View Slide

  159. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods

    View Slide

  160. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods
    class Test {

    public static void main(String... args) {

    new Test().method();

    }


    public void method() {

    System.out.println("Hello, method!");

    }

    }

    View Slide

  161. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods
    public static void main(java.lang.String...);
    Code:
    ...
    8: aload_1
    9: invokevirtual #4 // Method method:()V

    View Slide

  162. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods
    invokeinterface
    interface
    methods

    View Slide

  163. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods
    invokeinterface
    interface
    methods
    class Test {

    public static void main(String... args) {

    List names = Arrays.asList("Alice", "Bob", "Eve");

    int size = names.size();

    System.out.println(size);

    }

    }

    View Slide

  164. invokestatic
    static methods
    invokespecial
    constructors
    private methods
    super methods
    invokevirtual
    other class
    methods
    invokeinterface
    interface
    methods
    public static void main(java.lang.String...);
    Code:
    ...
    23: aload_1
    24: invokeinterface #7, 1 // InterfaceMethod java/util/List.size:()I

    View Slide

  165. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X

    View Slide

  166. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address

    View Slide

  167. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  168. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  169. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    Object.toString 101
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  170. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    Object.toString 101
    Object.hashCode 102
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  171. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    Object.toString 101
    Object.hashCode 102
    ...
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  172. Method Address
    Object.toString 101
    Object.hashCode 102
    ...
    public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  173. Method Address
    Object.toString 101
    Object.hashCode 102
    Context.getResources 201
    ...
    public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  174. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object
    Method Address
    Object.toString 101
    Object.hashCode 102
    Context.getResources 201
    ...

    View Slide

  175. Method Address
    Object.toString 101
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  176. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    Object.toString 101
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object

    View Slide

  177. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object
    Method Address
    Object.toString 101
    Object.hashCode 102
    ContextTW.getResources 301
    ...

    View Slide

  178. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    MyActivity
    Activity
    ContextThemeWrapper
    Context
    Object
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...

    View Slide

  179. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...

    View Slide

  180. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    getResources();

    View Slide

  181. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    getResources(); Method table lookup

    View Slide

  182. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    getResources(); Method table lookup Jump

    View Slide

  183. public class MyActivity extends Activity {
    @Override protected void onCreate(Bundle bundle) {

    super.onCreate(bundle);

    Resources res = getResources();
    // ...

    }X
    @Override public String toString() {

    return "MyActivity";

    }X
    }X
    Method Address
    MyActivity.toString 501
    Object.hashCode 102
    ContextTW.getResources 301
    ...
    getResources();
    getResources();
    getResources();
    getResources();
    getResources();
    Method table lookup Jump
    Method table lookup Jump
    Method table lookup Jump
    Method table lookup Jump
    Method table lookup Jump

    View Slide

  184. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X

    strings.size()

    View Slide

  185. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X
    strings.size()

    View Slide

  186. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X
    strings.size() Class lookup

    View Slide

  187. public boolean firstShorterThan(List strings, int max) {

    for (int i = 0; i < strings.size(); i++) {

    if (strings.get(i).length() > max) {

    return i;

    }X

    }X

    return -1;

    }X
    strings.size() Method table lookup Jump
    Class lookup

    View Slide

  188. What about JIT & AOT compilers?

    View Slide

  189. Resources res = getResources();

    View Slide

  190. Resources res = getResources();
    public Resources getResources() {

    return mResources;

    }X
    private Resources mResources;

    View Slide

  191. Resources res = mResources;
    private Resources mResources;

    View Slide

  192. Resources res = mResources;
    private Resources mResources;
    mResources

    View Slide

  193. Resources res = mResources;
    private Resources mResources;
    mResources Memory lookup

    View Slide

  194. Resources res = mResources;
    private Resources mResources;
    mResources Memory lookup Copy to local

    View Slide

  195. Resources res = mResources;
    private Resources mResources;
    mResources Memory lookup Copy to local
    mResources
    mResources
    mResources
    mResources

    View Slide

  196. Resources res = mResources;
    private Resources mResources;
    mResources Memory lookup Copy to local
    mResources
    mResources
    mResources
    mResources
    Memory lookup Copy to local
    Memory lookup Copy to local
    Memory lookup Copy to local
    Memory lookup Copy to local

    View Slide

  197. for (int i = 0; i < strings.size(); i++)

    View Slide

  198. for (int i = 0; i < strings.size(); i++)
    @Override
    public int size() {

    return ;

    }
    int size;

    size

    View Slide

  199. for (int i = 0; ix< strings. ;yi++)
    int size;
    size

    View Slide

  200. for (int i = 0; ix< strings.size;yi++)
    int size;
    size

    View Slide

  201. for (int i = 0; ix< strings.size;yi++)
    int size;
    size Memory lookup Copy to local

    View Slide

  202. for (int i = 0; ix< strings.size;yi++)
    int size;
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy to local
    size Memory lookup Copy
    size Memory lookup
    ookup Copy to local
    size Memory

    View Slide

  203. for (int i = 0; ix< strings.size;yi++)
    int size;

    View Slide

  204. for (int i = 0, size = strings.size; ix< size;yi++)
    int size;

    View Slide

  205. for (int i = 0, size = strings.size; ix< size;yi++)
    int size;
    Memory lookup Copy to local
    size

    View Slide

  206. StringBuilder b = new StringBuilder(key).append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());
    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X
    public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  207. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (User user : users) {

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  208. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  209. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  210. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  211. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  212. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  213. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (Iterator iter = users.iterator(); iter.hasNext(); ) {

    User user = iter.next();

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  214. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (int x = 0, size = users.size(); x < size; x++) {

    User user = users.get(x);

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  215. public List names(List users) {

    List names = new ArrayList<>(users.size());

    for (int x = 0, size = users.size(); x < size; x++) {

    User user = users.get(x);

    names.add(user.name);

    }X

    return unmodifiableList(names);

    }X

    View Slide

  216. StringBuilder b = new StringBuilder(key).append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());
    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  217. int valueCount = this.valueCount;
    File directory = this.directory;
    File[] cleanFiles = this.cleanFiles;
    File[] dirtyFiles = this.dirtyFiles;
    StringBuilder b = new StringBuilder(key).append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());
    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  218. StringBuilder b = new StringBuilder(key).append(".");
    int truncateTo = b.length();
    for (int x = 0; x < valueCount; x++) {

    b.append(x);

    cleanFiles[x] = new File(directory, b.toString());
    b.append(".tmp");

    dirtyFiles[x] = new File(directory, b.toString());
    b.setLength(truncateTo);

    }X

    View Slide

  219. What else?
    • Polymorphic virtual method calls
    • Monomorphic vs. bimorphic vs. megamorphic
    • Concurrency implications & locks
    • Read/write when lock, act out of lock
    • synchronized vs. concurrent lock types

    View Slide

  220. View Slide

  221. jakewharton
    jakewharton
    jakewharton
    twitter.com/
    google.com/+
    .com
    Eliminating Code Overhead

    View Slide