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

A Comprehensive Study on the Energy Efficiency of Java Thread-Save Collections

Gustavo Pinto
January 14, 2018
110

A Comprehensive Study on the Energy Efficiency of Java Thread-Save Collections

Gustavo Pinto

January 14, 2018
Tweet

Transcript

  1. A Comprehensive Study on
    the Energy Efficiency of Java
    Thread-Safe Collections
    Fernando Castor
    Kenan Liu
    Gustavo Pinto David Liu
    1

    View Slide

  2. Disclaimer
    2

    View Slide

  3. 3
    Miguel
    turns
    8mo
    today!

    View Slide

  4. Motivations
    4

    View Slide

  5. First, energy consumption is not only a concern for
    unwired devices, but also for data centers
    5

    View Slide

  6. First, energy consumption is not only a concern for
    unwired devices, but also for data centers
    6
    Second, multicore CPUs are ubiquitous

    View Slide

  7. First, energy consumption is not only a concern for
    unwired devices, but also for data centers
    7
    Second, multicore CPUs are ubiquitous
    Third, data structures are the fundamentals of
    computer programming

    View Slide

  8. In case you are a Java
    programmer…
    8

    View Slide

  9. 9
    List lists = …;
    • ArrayList
    • LinkedList

    View Slide

  10. 10
    List lists = new ArrayList<>();

    View Slide

  11. 11
    List lists = new ArrayList<>();
    Thread

    View Slide

  12. 12
    • ArrayList
    • LinkedList
    • Vector
    • Collections.synchronizedList()
    • CopyOnWriteArrayList
    List lists = …;
    Non Thread-Safe
    Thread-Safe

    View Slide

  13. 13
    List lists = new Vector<>();

    View Slide

  14. 14
    List lists = new Vector<>();
    Thread

    View Slide

  15. 15
    Thread
    Thread-safe!
    List lists = new Vector<>();

    View Slide

  16. 16
    Thread
    {
    }

    List lists = new Vector<>();

    View Slide

  17. 17
    Thread
    {
    }

    List lists = new Vector<>();

    View Slide

  18. 18
    List lists = new CopyOnWriteArrayList<>();

    View Slide

  19. 19
    Thread
    Thread-safe!
    List lists = new CopyOnWriteArrayList<>();

    View Slide

  20. List lists = new CopyOnWriteArrayList<>();
    20
    {
    }
    Thread
    Thread-safe!

    View Slide

  21. 21
    List lists = …;
    • ArrayList
    • LinkedList
    • Vector
    • Collections.synchronizedList()
    • CopyOnWriteArrayList
    Non Thread-Safe
    Thread-Safe

    View Slide

  22. 22
    List lists = …;
    Set sets = …;
    Map maps = …;

    View Slide

  23. 23
    List lists = …;
    Set sets = …;
    Map maps = …;

    View Slide

  24. 24
    List lists = …;
    Set sets = …;
    Map maps = …;
    And how about
    energy consumption?

    View Slide

  25. 16 Collections
    25
    List
    ArrayList
    Vector
    Collections.syncList()
    CopyOnWriteArrayList
    Set
    LinkedHashSet
    Collections.syncSet()
    CopyOnWriteArraySet
    ConcurrentSkipListSet
    ConcurrentHashSet
    ConcurrentHashSetV8
    Map
    LinkedHashMap
    Hashtable
    Collections.syncMap()
    ConcurrentSkipListMap
    ConcurrentHashMap
    ConcurrentHashMapV8

    View Slide

  26. 16 Collections
    26
    List
    ArrayList
    Vector
    Collections.syncList()
    CopyOnWriteArrayList
    Set
    LinkedHashSet
    Collections.syncSet()
    CopyOnWriteArraySet
    ConcurrentSkipListSet
    ConcurrentHashSet
    ConcurrentHashSetV8
    Map
    LinkedHashMap
    Hashtable
    Collections.syncMap()
    ConcurrentSkipListMap
    ConcurrentHashMap
    ConcurrentHashMapV8
    Non thread-safe
    Thread-safe

    View Slide

  27. 16 Collections
    27
    List
    ArrayList
    Vector
    Collections.syncList()
    CopyOnWriteArrayList
    Set
    LinkedHashSet
    Collections.syncSet()
    CopyOnWriteArraySet
    ConcurrentSkipListSet
    ConcurrentHashSet
    ConcurrentHashSetV8
    Map
    LinkedHashMap
    Hashtable
    Collections.syncMap()
    ConcurrentSkipListMap
    ConcurrentHashMap
    ConcurrentHashMapV8
    Java 7
    Java 8

    View Slide

  28. 16 Collections
    28
    List
    ArrayList
    Vector
    Collections.syncList()
    CopyOnWriteArrayList
    Set
    LinkedHashSet
    Collections.syncSet()
    CopyOnWriteArraySet
    ConcurrentSkipListSet
    ConcurrentHashSet
    ConcurrentHashSetV8
    Map
    LinkedHashMap
    Hashtable
    Collections.syncMap()
    ConcurrentSkipListMap
    ConcurrentHashMap
    ConcurrentHashMapV8
    x 3 Operations
    Traversal Insertion Removal

    View Slide

  29. 2 Environments
    AMD CPU: A 2×16-core, running Debian, 2.4 GHz,
    64GB of memory, JDK version 1.7
    .0 11, build 21.
    29
    Intel CPU: A 2×8-core (32-cores w/ hyper-threading),
    running Debian, 2.60GHz, with 64GB of memory, JDK
    version 1.7
    .0 71, build 14.

    View Slide

  30. 2 Environments
    AMD CPU: A 2×16-core, running Debian, 2.4 GHz,
    64GB of memory, JDK version 1.7
    .0 11, build 21.
    30
    Intel CPU: A 2×8-core (32-cores w/ hyper-threading),
    running Debian, 2.60GHz, with 64GB of memory, JDK
    version 1.7
    .0 71, build 14.
    Hardware-based energy measurement
    Software-based energy measurement

    View Slide

  31. 31
    More details about how the experiments
    were conducted?
    http:/
    /icsme2016.github.io/program/accepted.html

    View Slide

  32. Results
    32

    View Slide

  33. 33
    Traversal Insertion Removal
    Intel CPU
    AMD CPU
    Traversal Insertion Removal
    Lists

    View Slide

  34. 34
    ArrayList Vector
    Lists
    Collections.synchronizedList()

    View Slide

  35. 35
    Lists
    ArrayList Vector
    Collections.synchronizedList()
    Energy (Joules)

    View Slide

  36. 36
    Lists
    ArrayList Vector
    Energy (Joules) Power (Watts)
    Collections.synchronizedList()

    View Slide

  37. 37
    Lists
    ArrayList Vector
    Energy (Joules) Power (Watts)
    Collections.synchronizedList()

    View Slide

  38. Traversal Insertion Removal
    Intel CPU
    AMD CPU
    38
    38
    Traversal Insertion Removal
    Lists

    View Slide

  39. 39
    Traversal Insertion Removal
    Intel CPU
    AMD CPU
    39
    Traversal Insertion Removal
    Lists

    View Slide

  40. 40
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  41. 41
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  42. 42
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  43. 43
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  44. 44
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  45. 45
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal

    View Slide

  46. 46
    Maps
    Intel CPU
    Traversal Insertion Removal
    AMD CPU
    Traversal Insertion Removal
    Less energy than the non thread-safe
    implementation!

    View Slide

  47. Case Study
    47

    View Slide

  48. 48
    Tomcat
    > A web server
    > More than 170K lines of Java code
    > More than 300 Hashtables

    View Slide

  49. 49
    Tomcat
    Xalan
    > Parses XML in HTML documents
    > More than 188K lines of Java code
    > More than 140 Hashtables
    > A web server
    > More than 170K lines of Java code
    > More than 300 Hashtables

    View Slide

  50. 50
    For each Hashtable
    instance, change it for
    a ConcurrentHashMap
    one. Do it again for
    ConcurrentHashMapV8
    Task:

    View Slide

  51. 51
    Tomcat
    Hashtable to CHM: -12.21%
    Hashtable to CHM8: -17
    .82%

    View Slide

  52. 52
    Tomcat Xalan
    Hashtable to CHM: -12.21%
    Hashtable to CHM8: -17
    .82%
    Hashtable to CHM: -5.82%
    Hashtable to CHM8: -9.32%

    View Slide

  53. 53
    So, lets change all Hashtable
    instances to ConcurrentHashMap!
    Not so fast, young padawan…

    View Slide

  54. 54
    Hashtable ConcurrentHashMap
    Map 

    implements

    View Slide

  55. 55
    Hashtable ConcurrentHashMap
    Cloneable 

    Map 

    implements

    View Slide

  56. 56
    Hashtable ConcurrentHashMap
    List obj = new Hashtable<>();
    obj.clone();
    Cloneable 

    Map 

    /
    / works fine
    implements

    View Slide

  57. 57
    Hashtable ConcurrentHashMap
    List obj = new Hashtable<>();
    obj.clone();
    Cloneable 

    Map 

    /
    / works fine
    /
    / compiler error
    implements
    List obj = new ConcurrentHashMap<>();
    obj.clone();

    View Slide

  58. 58
    Hashtable ConcurrentHashMap
    List obj = new Hashtable<>();
    obj.clone();
    Cloneable 

    Map 

    /
    / works fine
    /
    / compiler error
    implements
    List obj = new ConcurrentHashMap<>();
    obj.clone();
    Danny Dig
    Opportunity for improving
    refactoring tools!

    View Slide

  59. Take Away Messages
    59

    View Slide

  60. 60
    Small changes can have
    GREAT impacts, when it
    comes to energy
    consumption

    View Slide

  61. 61
    Doug Lea
    Stay up-to-date with the
    new releases of the
    java.util.concurrent library

    View Slide

  62. In Summary
    62

    View Slide

  63. 63

    View Slide

  64. 64
    THANKS

    View Slide

  65. A Comprehensive Study on
    the Energy Efficiency of Java
    Thread-Safe Collections
    Fernando Castor
    Kenan Liu
    Gustavo Pinto David Liu
    65

    View Slide

  66. Experimental Environments
    66
    AMD CPU: A 2×16-core, running Debian, 2.4 GHz,
    64GB of memory, JDK version 1.7
    .0 11, build 21.
    Intel CPU: A 2×8-core (32-cores w/ hyper-threading),
    running Debian, 2.60GHz, with 64GB of memory, JDK
    version 1.7
    .0 71, build 14.

    View Slide

  67. 67
    Maps (scaling number of threads)
    Intel CPU
    Traversal
    Insertion

    View Slide