28
Uncovering Performance Problems in Java Applica5ons with Reference Propaga5on Profiling PRESTO: Program Analyses and So5ware Tools Research Group, Ohio State University Dacong Yan 1 , Guoqing Xu 2 , Atanas Rountev 1 1 Ohio State University 2 University of California, Irvine

Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Embed Size (px)

DESCRIPTION

Uncovering Performance Problems in Java Applications with Reference Propagation Profiling, ICSE'2012

Citation preview

Page 1: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Uncovering  Performance  Problems  in  Java  Applica5ons  with  Reference  Propaga5on  Profiling  

PRESTO:  Program  Analyses  and  So5ware  Tools  Research  Group,  Ohio  State  University  

Dacong  Yan1,  Guoqing  Xu2,  Atanas  Rountev1    

1  Ohio  State  University  2  University  of  California,  Irvine  

   

Page 2: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Overview  •  Performance  inefficiencies  

– O5en  exist  in  Java  applicaKons  – Excessive  memory  usage  – Long  running  Kmes,  even  for  simple  tasks  

•  Challenges  – Limited  compiler  opKmizaKons  – Complicated  behavior  – Large  libraries  and  frameworks  

•  SoluKon:  manual  tuning  assisted  with  performance  analysis  tools  

2  

Page 3: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

3  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 4: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

4  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 5: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

5  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 6: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

6  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 7: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

7  

Page 8: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

8  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 9: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

ImplementaKon  •  Reference  propagaKon  profiling  

–  Implemented  in  Jikes  RVM  3.1.1  – Modify  the  runKme  compiler  for  code  instrumentaKon  – Create  shadow  loca5ons  to  track  data  dependence  –  Instrument  method  calls  to  track  interprocedural  propaga5on  

•  Overheads  – Space:  2-­‐3×  – Time:  30-­‐50×    

9  

Page 10: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

10  

Page 11: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

11  

Page 12: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

12  

Page 13: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

13  

Page 14: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

14  

Page 15: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

15  

•  Interprocedural  propagaKon  – Per-­‐thread  scratch  space  save  and  restore  shadows  for  parameters  and  return  variables  

Page 16: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  

16  

Page 17: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  

17  

Page 18: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  •  Cost-­‐benefit  imbalance  analysis  

– Detect  imbalance  between  the  cost  of  interesKng  operaKons,  and  the  benefits  they  produce  

– For  example,  analysis  of  write  read  imbalance  

18  

Page 19: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  •  Cost-­‐benefit  imbalance  analysis  

– Detect  imbalance  between  the  cost  of  interesKng  operaKons,  and  the  benefits  they  produce  

– For  example,  analysis  of  write  read  imbalance  •  Analysis  of  never-­‐used  allocaKons  

–  IdenKfy  producer  nodes  that  do  not  reach  the  consumer  node  

– Variant:  analysis  of  rarely-­‐used  allocaKons  19  

Page 20: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

20  

Page 21: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

21  

Page 22: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

22  

1 2

1

2

Page 23: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

23  

1 2

1

2

Page 24: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub_rev(v, res) { 4 res.x = x-v.x; 5 res.y = y-v.y; 6 } 7 }

24  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 in[i+1].sub_rev(a[i-2], nt); 12 // use of fields of nt 13 } … … 80 t=q[*]; 81 // use of fields of t

1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

tuning

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

nt = new Vec; // reusable

Page 25: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub_rev(v, res) { 4 res.x = x-v.x; 5 res.y = y-v.y; 6 } 7 }

25  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 in[i+1].sub_rev(a[i-2], nt); 12 // use of fields of nt 13 } … … 80 t=q[*]; 81 // use of fields of t

1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

tuning

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

nt = new Vec; // reusable

Reductions: 13% in running time and 73% in #allocated objects

Page 26: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Examples  of  Inefficiency  Pa`erns  •  Temporary  objects  for  method  returns  

– ReducKons  for  euler:  13%  in  running  Kme  and  73%  in  #allocated  objects  

•  Redundant  data  representaKon  – mst:  63%  and  40%  

•  Unnecessary  eager  object  creaKon  – chart:  8%  and  8% – jflex:  3%  and  27%  

•  Expensive  specializaKon  for  sanity  checks  – bloat:  10%  and  11%  

26  

Page 27: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Conclusions •  Reference  propagaKon  profiling  in  Jikes  RVM  •  Understanding  reference  propagaKon  is  a  good  starKng  point  for  performance  tuning  

•  Client  analyses  can  uncover  performance  inefficiencies,  and  lead  to  effecKve  tuning  soluKons  

27  

Page 28: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

                                 Thank    you  

28