Slide 1

Slide 1 text

Eliminating Code Overhead Jake Wharton

Slide 2

Slide 2 text

CPU

Slide 3

Slide 3 text

Memory CPU

Slide 4

Slide 4 text

Memory CPU I/O

Slide 5

Slide 5 text

Memory CPU I/O Battery

Slide 6

Slide 6 text

Battery Memory CPU I/O

Slide 7

Slide 7 text

Battery Battery Memory CPU I/O

Slide 8

Slide 8 text

Battery Battery Memory CPU I/O

Slide 9

Slide 9 text

Battery Battery Memory CPU I/O

Slide 10

Slide 10 text

Battery Battery Battery Memory CPU I/O

Slide 11

Slide 11 text

Battery Battery Battery Memory CPU I/O

Slide 12

Slide 12 text

Battery Battery Battery Memory CPU I/O

Slide 13

Slide 13 text

Memory CPU I/O

Slide 14

Slide 14 text

Memory CPU I/O

Slide 15

Slide 15 text

• 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

Slide 16

Slide 16 text

• 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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 24

Slide 24 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 25

Slide 25 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 26

Slide 26 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 27

Slide 27 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 28

Slide 28 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 29

Slide 29 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 30

Slide 30 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 31

Slide 31 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 32

Slide 32 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 33

Slide 33 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 34

Slide 34 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 35

Slide 35 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 36

Slide 36 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 37

Slide 37 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 38

Slide 38 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 39

Slide 39 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 40

Slide 40 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 41

Slide 41 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 42

Slide 42 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 43

Slide 43 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 44

Slide 44 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 45

Slide 45 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 46

Slide 46 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 47

Slide 47 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 48

Slide 48 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 49

Slide 49 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 50

Slide 50 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 51

Slide 51 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 52

Slide 52 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 53

Slide 53 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 54

Slide 54 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 55

Slide 55 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 56

Slide 56 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 57

Slide 57 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 58

Slide 58 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 59

Slide 59 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 60

Slide 60 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 61

Slide 61 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 62

Slide 62 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 63

Slide 63 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 64

Slide 64 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 65

Slide 65 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 66

Slide 66 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 67

Slide 67 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 68

Slide 68 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 69

Slide 69 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 70

Slide 70 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 71

Slide 71 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 72

Slide 72 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 73

Slide 73 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 74

Slide 74 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 75

Slide 75 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }
 return unmodifiableList(names);
 }

Slide 76

Slide 76 text

public List names(List users) {
 List names = new ArrayList<>();
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 77

Slide 77 text

public List names(List users) {
 List names = new ArrayList<>(users.size());
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 78

Slide 78 text

public List names(List users) {
 List names = new ArrayList<>(users.size());
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 79

Slide 79 text

public List names(List users) {
 List names = new ArrayList<>(users.size());
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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,•

Slide 91

Slide 91 text

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,•

Slide 92

Slide 92 text

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,•

Slide 93

Slide 93 text

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,•

Slide 94

Slide 94 text

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,•

Slide 95

Slide 95 text

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,•

Slide 96

Slide 96 text

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,•

Slide 97

Slide 97 text

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,•

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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,•

Slide 102

Slide 102 text

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,•

Slide 103

Slide 103 text

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,•

Slide 104

Slide 104 text

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,•

Slide 105

Slide 105 text

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,•

Slide 106

Slide 106 text

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,•

Slide 107

Slide 107 text

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,•

Slide 108

Slide 108 text

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,•

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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,•

Slide 113

Slide 113 text

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,•

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

for (int x = 0; x < valueCount; x++) {
 cleanFiles[x] = new File(directory, key + "." + x);
 dirtyFiles[x] = new File(directory, key + "." + x + ".tmp");
 }X

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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.

Slide 135

Slide 135 text

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.

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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);
 }

Slide 142

Slide 142 text

public boolean validIndices(int[] indices, String string) {
 for (int index : indices) {
 if (index < 0 && index >= string.length()) {
 return false;
 }X
 }X
 return true;
 }X

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

public boolean firstShorterThan(List strings, int max) {
 for (int i = 0;ciy max) {
 return i;
 }X
 }X
 return -1;
 }X

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

No content

Slide 154

Slide 154 text

invokestatic static methods

Slide 155

Slide 155 text

invokestatic static methods class Test {
 public static void main(String... args) {
 staticMethod();
 } 
 public static void staticMethod() {
 System.out.println("Hello, static method!");
 }
 }

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

invokestatic static methods invokespecial constructors private methods super methods

Slide 158

Slide 158 text

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

Slide 159

Slide 159 text

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

Slide 160

Slide 160 text

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!");
 }
 }

Slide 161

Slide 161 text

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

Slide 162

Slide 162 text

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

Slide 163

Slide 163 text

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);
 }
 }

Slide 164

Slide 164 text

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

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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 ...

Slide 175

Slide 175 text

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

Slide 176

Slide 176 text

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

Slide 177

Slide 177 text

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 ...

Slide 178

Slide 178 text

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 ...

Slide 179

Slide 179 text

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 ...

Slide 180

Slide 180 text

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();

Slide 181

Slide 181 text

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

Slide 182

Slide 182 text

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

Slide 183

Slide 183 text

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

Slide 184

Slide 184 text

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()

Slide 185

Slide 185 text

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()

Slide 186

Slide 186 text

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

Slide 187

Slide 187 text

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

Slide 188

Slide 188 text

What about JIT & AOT compilers?

Slide 189

Slide 189 text

Resources res = getResources();

Slide 190

Slide 190 text

Resources res = getResources(); public Resources getResources() {
 return mResources;
 }X private Resources mResources;

Slide 191

Slide 191 text

Resources res = mResources; private Resources mResources;

Slide 192

Slide 192 text

Resources res = mResources; private Resources mResources; mResources

Slide 193

Slide 193 text

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

Slide 194

Slide 194 text

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

Slide 195

Slide 195 text

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

Slide 196

Slide 196 text

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

Slide 197

Slide 197 text

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

Slide 198

Slide 198 text

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

Slide 199

Slide 199 text

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

Slide 200

Slide 200 text

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

Slide 201

Slide 201 text

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

Slide 202

Slide 202 text

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

Slide 203

Slide 203 text

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

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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

Slide 206

Slide 206 text

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

Slide 207

Slide 207 text

public List names(List users) {
 List names = new ArrayList<>(users.size());
 for (User user : users) {
 names.add(user.name);
 }X
 return unmodifiableList(names);
 }X

Slide 208

Slide 208 text

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

Slide 209

Slide 209 text

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

Slide 210

Slide 210 text

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

Slide 211

Slide 211 text

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

Slide 212

Slide 212 text

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

Slide 213

Slide 213 text

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

Slide 214

Slide 214 text

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

Slide 215

Slide 215 text

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

Slide 216

Slide 216 text

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

Slide 217

Slide 217 text

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

Slide 218

Slide 218 text

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

Slide 219

Slide 219 text

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

Slide 220

Slide 220 text

No content

Slide 221

Slide 221 text

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