Replacing System.out IO, Logging, and Console Output
8.1 Replacing System.out
Typically, an application generates output to System.out or System.err , if only for logging purposes during development. It is important to realize that this output can affect performance. Any output not present in the final deployed version of the application should be turned off during performance tests; otherwise, your performance results can get skewed. This is also true for any other IO: to disk, pipes, other processes, or the network. It is best to include a framework for logging output in your design. You want a framework that centralizes all your logging operations and lets you enable or disable certain logging features perhaps by setting a debug level. You may want to implement your own logging class, which decides whether to send output at all and where to send it. The Unix syslog utility provides a good starting point for designing such a framework. It has levels of priority emergency, alert, critical, error, warning, notice, info, debug and other aspects that are useful to note. If you are already well into development without this kind of framework, but need a quick fix for handling unnecessary output, it is still possible to replace System.out and System.err . It is simple to replace the print stream in System.out and System.err . You need an instance of a java.io.PrintStream or one of its subclasses, and you can use the System.setOut and System.setErr methods to replace the current PrintStream instances. It is useful to retain a reference to the original print-stream objects you are replacing, since these retain access to the console. For example, the following class simply eliminates all output sent to System.out and System.err if TUNING is true ; otherwise, it sends all output to the original destination. This class illustrates how to implement your own redirection classes: package tuning.console; public class PrintWrapper extends java.io.PrintStream { java.io.PrintStream wrappedOut; public static boolean TUNING = false; public static void install { System.setOutnew PrintWrapperSystem.out; System.setErrnew PrintWrapperSystem.err; } public PrintWrapperjava.io.PrintStream out { superout; wrappedOut = out; } public boolean checkError {return wrappedOut.checkError ;} public void close {wrappedOut.close ;} public void flush {wrappedOut.flush ;} public void printboolean x {if TUNING wrappedOut.printx;} public void printchar x {if TUNING wrappedOut.printx;} public void printchar[] x {if TUNING wrappedOut.printx;} public void printdouble x {if TUNING wrappedOut.printx;} public void printfloat x {if TUNING wrappedOut.printx;} public void printint x {if TUNING wrappedOut.printx;} public void printlong x {if TUNING wrappedOut.printx;} public void printObject x {if TUNING wrappedOut.printx;} public void printString x {if TUNING wrappedOut.printx;} - 170 - public void println {if TUNING wrappedOut.println ;} public void printlnboolean x {if TUNING wrappedOut.printlnx;} public void printlnchar x {if TUNING wrappedOut.printlnx;} public void printlnchar[] x {if TUNING wrappedOut.printlnx;} public void printlndouble x {if TUNING wrappedOut.printlnx;} public void printlnfloat x {if TUNING wrappedOut.printlnx;} public void printlnint x {if TUNING wrappedOut.printlnx;} public void printlnlong x {if TUNING wrappedOut.printlnx;} public void printlnObject x {if TUNING wrappedOut.printlnx;} public void printlnString x {if TUNING wrappedOut.printlnx;} public void writebyte[] x, int y, int z { if TUNING wrappedOut.writex,y,z;} public void writeint x {if TUNING wrappedOut.writex;} }8.2 Logging
Parts
» OReilly.Java.performance tuning
» The Tuning Game System Limitations and What to Tune
» A Tuning Strategy Introduction
» Threading to Appear Quicker Streaming to Appear Quicker
» User Agreements Starting to Tune
» Setting Benchmarks Starting to Tune
» The Benchmark Harness Starting to Tune
» Taking Measurements Starting to Tune
» What to Measure Introduction
» Dont Tune What You Dont Need to Tune
» Measurements and Timings Profiling Tools
» Garbage Collection Profiling Tools
» Profiling Methodology Method Calls
» Java 2 cpu=samples Profile Output
» HotSpot and 1.3 -Xprof Profile Output
» JDK 1.1.x -prof and Java 2 cpu=old Profile Output
» Object-Creation Profiling Profiling Tools
» Monitoring Gross Memory Usage
» Replacing Sockets ClientServer Communications
» Performance Checklist Profiling Tools
» Garbage Collection Underlying JDK Improvements
» Replacing JDK Classes Underlying JDK Improvements
» VM Speed Variations VMs with JIT Compilers
» Other VM Optimizations Faster VMs
» Inline calls Remove dynamic type checks Unroll loops Code motion
» Literal constants are folded String concatenation is sometimes folded Constant fields are inlined
» Optimizations Performed When Using the -O Option
» Performance Effects From Runtime Options
» Compile to Native Machine Code
» Native Method Calls Underlying JDK Improvements
» Uncompressed ZIPJAR Files Underlying JDK Improvements
» Performance Checklist Underlying JDK Improvements
» Object-Creation Statistics Object Creation
» Pool Management Object Reuse
» Reusable Parameters Object Reuse
» String canonicalization Changeable objects
» Weak references Canonicalizing Objects
» Avoiding Garbage Collection Object Creation
» Preallocating Objects Lazy Initialization
» Performance Checklist Object Creation
» The Performance Effects of Strings
» Compile-Time Versus Runtime Resolution of Strings
» Converting bytes, shorts, chars, and booleans to Strings Converting floats to Strings
» Converting doubles to Strings
» Converting Objects to Strings
» Word-Counting Example Strings Versus char Arrays
» Line Filter Example HotSpot 1.0
» String Comparisons and Searches
» Sorting Internationalized Strings Strings
» The Cost of try-catch Blocks Without an Exception
» The Cost of try-catch Blocks with an Exception
» Using Exceptions Without the Stack Trace Overhead Conditional Error Checking
» no JIT 1.3 Variables Strings
» Method Parameters Performance Checklist
» Exception-Terminated Loops Loops and Switches
» no JIT 1.3 Loops and Switches
» Recursion Loops and Switches
» no HotSpot 1.0 2nd Loops and Switches
» Recursion and Stacks Loops and Switches
» Performance Checklist Loops and Switches
» Replacing System.out IO, Logging, and Console Output
» Logging From Raw IO to Smokin IO
» no JIT HotSpot 1.0 no JIT HotSpot 1.0 Serialization
» no IO, Logging, and Console Output
» Clustering Objects and Counting IO Operations
» Compression IO, Logging, and Console Output
» Performance Checklist IO, Logging, and Console Output
» Avoiding Unnecessary Sorting Overhead
» An Efficient Sorting Framework
» no HotSpot Better Than Onlogn Sorting
» User-Interface Thread and Other Threads
» Desynchronization and Synchronized Wrappers
» Avoiding Serialized Execution HotSpot 1.0
» no JIT no JIT HotSpot 1.0 Timing Multithreaded Tests
» Atomic Access and Assignment
» Free Load Balancing from TCPIP
» Load-Balancing Classes Load Balancing
» A Load-Balancing Example Load Balancing
» Threaded Problem-Solving Strategies Threading
» Collections Appropriate Data Structures and Algorithms
» Java 2 Collections Appropriate Data Structures and Algorithms
» Hashtables and HashMaps Appropriate Data Structures and Algorithms
» Cached Access Appropriate Data Structures and Algorithms
» Caching Example I Appropriate Data Structures and Algorithms
» Caching Example II Appropriate Data Structures and Algorithms
» Finding the Index for Partially Matched Strings
» Search Trees Appropriate Data Structures and Algorithms
» Comparing Communication Layers Distributed Computing
» Batching I Application Partitioning
» Compression Caching Low-Level Communication Optimizations
» Transfer Batching Low-Level Communication Optimizations
» Batching II Distributed Garbage Collection
» Performance Checklist Distributed Computing
» When Not to Optimize Tuning Class Libraries and Beans
» Scaling Design and Architecture
» Distributed Applications Design and Architecture
» Object Design Design and Architecture
» Use simulations and benchmarks Consider the total work done and the design overhead
» Tuning After Deployment When to Optimize
» User Interface Usability Training Server Downtime
» Performance Checklist When to Optimize
» Clustering Files Cached Filesystems RAM Disks, tmpfs, cachefs
» Disk Fragmentation Disk Sweet Spots
» RAM Underlying Operating System and Network Improvements
» Network Bottlenecks Network IO
» Performance Checklist Underlying Operating System and Network Improvements
Show more