370 likes | 455 Views
An In-Depth Examination of Java I/O Performance and Possible Tuning Strategies. Kai Xu xuk@cs.wisc.edu Hongfei Guo guo@cs.wisc.edu. Outline. Why bother? (Problems) Our goals Java I/O overview Tests design Test results and analysis Conclusions. Why bother?.
E N D
An In-Depth Examination of Java I/O Performance and Possible Tuning Strategies Kai Xu xuk@cs.wisc.edu Hongfei Guo guo@cs.wisc.edu
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
OutputStream InputStream FileOutputStream FileInputStream ByteArrayOutputStream ByteArrayInputStream FilterOutputStream FilterInputStream BufferedOutputStream BufferedInputStream DataOutputStream DataInputStream An Overview of Java I/O Classes Random AccessFile
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 1.2.2 • 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
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
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
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
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
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++