An In-Depth Examination of Java I/O Performance and Possible Tuning Strategies Kai Xu Hongfei Guo
Outline Why bother? (Problems) Our goals Java I/O overview Tests design Test results and analysis Conclusions
Why bother? Growing interest in using Java Much works had been done in Java performance evaluation but NOT in Java I/O
Our Goals Is it really bad (Compared with C/C++) How bad Possible tuning strategies How well they work
Random AccessFile OutputStreamInputStream FileOutputStream FilterOutputStream ByteArrayOutputStream BufferedOutputStream DataOutputStream FileInputStream FilterInputStream ByteArrayInputStream BufferedInputStream DataInputStream An Overview of Java I/O Classes
Test Design Access patterns Sequential write/read Random write/read Data interested Elapse time, CPU breakdown Comparison group: C/C++
Test Design (continued) Tests on basic Java I/O strategies Test 1: The lowest level I/O Test 2: Buffered I/O Test 3: Direct buffering Test 4: Operation size Test 5: Java JNI
Test Setup Hardware configuration CPU: Pentium III 667 MHz Memory: 128 MB Disk: 10 GB IDE Software configuration OS : Redhat 6.2 JVM : JDK Profiling Tools: PerfAnal profiler, gprof profiler 2.9.5, time
Test 1: The lowest level Java I/O Test parameters: buffer size : 0 Byte operation size : 1 Byte Sequential Write/Read Random Write/Read
Sequential Write/Read
Breakdown -- File size: 100M
Random Write/Read
Breakdown -- File size: 10M
Test 1 Analysis Java raw I/O: 200%x slower Java system calls cost more read :224%x write: 158%x Random Access is similar
Test 2: Buffered I/O in Java Test parameters: buffer size : 1024 Bytes file size : 100 MB Sequential Write/Read Buffering Strategies: No Buffering: (FileInputStream/FileOutputStream) BufferedInputStream/BufferedOutputStream Direct Buffering
Buffering Strategies in Java
CPU Breakdown
Test 2 Analysis Buffering improves I/O reducing system calls Buffered Stream: ~25% Direct Buffering: ~40% special purpose vs. general purpose No buffering for random access
Test 3: Direct Buffering Test parameters: file size : 100 MB operation size : 1 Byte Sequential Write/Read Random Write/Read
Sequential Write/Read
Breakdown – Java
Breakdown – C
Random Write/Read
Breakdown – Java
Breakdown – C
Test 3 Analysis Direct buffering improves I/O: ~50% reducing system calls slower than C/C++: ~300% Larger buffer? no big gain : Amdahl’s law! Does not help in random access low hit ratio: less than 1%
Test 4: Operation Size Test parameters: buffer size : 0 Byte Sequential Write/Read Random Write/Read
Sequential Write/Read: 100M
Random Write/Read: 10M
Test 4 Analysis Increasing operation size helps: ~ 85% reducing I/O system calls comparable to C/C++ Large operation size –no big gain. Random Access is similar
Test 5: Java JNI Test parameters: file size : 100 MB buffer size : 4 KB Sequential Write/Read
Java JNI Buffering
Breakdown – JNI buffering
Test 5 Analysis I/O system calls are cheap (C/C++ level); But, cost of calling native method is high; Small operation size: more native calls, comparable to Direct Buffering; Large operation size: less native calls, comparable to C/C++.
Conclusions Java raw I/O: 200%x slower than C Buffering improves I/O Reducing system calls 220% improvement vs. no buffer But, still 364%x slower than C Random I/O – no help with buffering? – locality of access;
Conclusions (continued) Increasing operation size helps Comparable to C/C++ JNI system calls are cheap (C/C++ level); cost of calling native method is high; reduce native call times: Comparable to C/C++
Thank You…