- Timestamp:
- 12/06/13 05:48:28 (8 years ago)
- Location:
- Tests/JAVA/logger/src/main/java/com/db/logger
- Files:
-
- 4 added
- 9 edited
- 17 moved
Legend:
- Unmodified
- Added
- Removed
-
Tests/JAVA/logger/src/main/java/com/db/logger/api/FastLogger.java
r581 r589 7 7 public interface FastLogger { 8 8 9 public MessageFormatter formatter( final String formatMessage);9 public LogMessage message( final String messageFormat ); 10 10 11 11 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/FluentLogBuilder.java
r586 r589 1 package com.db.logger.api .impl;1 package com.db.logger.api; 2 2 3 3 … … 6 6 * created 20.11.13 at 23:51 7 7 */ 8 public interface Fluent Formatter {9 public Fluent Formatter with(double value );8 public interface FluentLogBuilder { 9 public FluentLogBuilder with( final double value ); 10 10 11 public Fluent Formatter with(long value );11 public FluentLogBuilder with( final long value ); 12 12 13 void submit(); 14 15 // public MessageFormatter with(final float value); 16 // public MessageFormatter with(final int value); 17 // public MessageFormatter with(final String value); 18 13 public void log(); 19 14 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/LogMessage.java
r586 r589 1 1 package com.db.logger.api; 2 3 import com.db.logger.api.impl.FluentFormatter;4 2 5 3 /** … … 7 5 * created 20.11.13 at 23:05 8 6 */ 9 public interface MessageFormatter extends FluentFormatter{7 public interface LogMessage { 10 8 public String format(); 11 9 12 10 public int argumentsCount(); 13 11 12 public FluentLogBuilder with( final double value ); 13 14 public FluentLogBuilder with( final long value ); 15 16 public void log(); 17 14 18 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/PlaygroundMain.java
r586 r589 7 7 import com.db.logger.api.impl.logger.CircularBuffer; 8 8 import com.db.logger.api.impl.logger.DemultiplexingSequencer; 9 import com.db.logger.api.impl.logger. SimpleMessageFormatter;9 import com.db.logger.api.impl.logger.formatters.SimpleLogMessage; 10 10 import com.db.logger.api.impl.logger.buffer.PlainLongsBuffer; 11 11 import com.db.logger.timesource.impl.JDKCombinedTimestampSource; … … 54 54 for( int i = 0; i < workers; i++ ) { 55 55 final int formatId = i; 56 final Simple MessageFormatter formatter = new SimpleMessageFormatter(56 final SimpleLogMessage formatter = new SimpleLogMessage( 57 57 "%d %f", 58 58 formatId, … … 68 68 formatter.with( 25.98 + formatId ) 69 69 .with( 100 + formatId ) 70 . submit();70 .log(); 71 71 } 72 72 } catch( Exception e ) { -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/DemultiplexingSequencer.java
r586 r589 32 32 33 33 static { 34 35 34 try { 36 35 final Field headCursorField = DemultiplexingSequencer.class.getDeclaredField( "headCursor" ); … … 38 37 HEAD_OFFSET = UNSAFE.objectFieldOffset( headCursorField ); 39 38 TAIL_OFFSET = UNSAFE.objectFieldOffset( tailCursorField ); 39 final long padding = TAIL_OFFSET - HEAD_OFFSET; 40 if( padding < 64 ) { 41 System.out.println( "Padding is optimized out: " + padding ); 42 } 40 43 } catch( NoSuchFieldException e ) { 41 44 throw new RuntimeException( e ); … … 58 61 * (tailCursor % size ) is the index of _cell_ for _next last item_ 59 62 */ 63 public volatile long r0, r1, r2, r3, r4, r5, r6, r7; 60 64 private volatile long headCursor = 0; 61 65 public volatile long p0, p1, p2, p3, p4, p5, p6, p7; 66 public volatile long q0, q1, q2, q3, q4, q5, q6, q7; 62 67 private volatile long tailCursor = 0; 68 public volatile long z0, z1, z2, z3, z4, z5, z6, z7; 63 69 64 70 public DemultiplexingSequencer( final int length ) { … … 137 143 } 138 144 139 140 class RightPad {141 public volatile long p0, p1, p2, p3, p4, p5, p6, p7;142 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/SimpleFastLogger.java
r587 r589 8 8 import com.db.logger.api.FastLogger; 9 9 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 10 import com.db.logger.api.impl.logger.formatters.SimpleLogMessage; 10 11 import com.db.logger.io.storage.RawWriter; 11 12 import com.google.common.base.Throwables; … … 62 63 // }; 63 64 64 private final HashMap<String, Simple MessageFormatter> formatters = new HashMap<String, SimpleMessageFormatter>();65 private final HashMap<String, SimpleLogMessage> formatters = new HashMap<String, SimpleLogMessage>(); 65 66 private final TObjectIntHashMap<String> formatsToID = new TObjectIntHashMap<String>( 128, 0.5f, NOT_FOUND ); 66 67 67 68 68 69 @Override 69 public synchronized Simple MessageFormatter formatter( final String formatMessage) {70 int formatId = formatsToID.get( formatMessage);70 public synchronized SimpleLogMessage message( final String messageFormat ) { 71 int formatId = formatsToID.get( messageFormat ); 71 72 if( formatId == NOT_FOUND ) { 72 73 formatId = formatsToID.size() + 1; 73 formatsToID.put( formatMessage, formatId );74 } 75 final int argumentsCount = calculateArgumentsCount( formatMessage);76 return new Simple MessageFormatter(77 formatMessage,74 formatsToID.put( messageFormat, formatId ); 75 } 76 final int argumentsCount = calculateArgumentsCount( messageFormat ); 77 return new SimpleLogMessage( 78 messageFormat, 78 79 formatId, 79 80 argumentsCount, … … 234 235 for( int i = 0; i <= argumentsCount; i++ ) { 235 236 final long arg = buffer.get( pos + i ); 236 //TODO RC: it is not required since Sequencer protect us 237 //TODO RC: it is not required since Sequencer protect us? 237 238 buffer.put( pos + i, NOT_SET );//need to reclaim each cell! 238 239 output.putLong( arg ); -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/ThreadLocalFastLogger.java
r587 r589 4 4 5 5 import com.db.logger.api.FastLogger; 6 import com.db.logger.api. MessageFormatter;7 import com.db.logger.api. impl.FluentFormatter;6 import com.db.logger.api.LogMessage; 7 import com.db.logger.api.FluentLogBuilder; 8 8 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 9 import com.db.logger.api.impl.logger.formatters.FlyweightLogMessage; 10 import com.db.logger.api.impl.logger.formatters.SimpleLogMessage; 9 11 import com.db.logger.io.storage.RawWriter; 10 12 … … 23 25 } 24 26 25 private final ThreadLocal<Flyweight MessageFormatter> holder = new ThreadLocal<FlyweightMessageFormatter>() {27 private final ThreadLocal<FlyweightLogMessage> holder = new ThreadLocal<FlyweightLogMessage>() { 26 28 @Override 27 protected Flyweight MessageFormatterinitialValue() {28 return new Flyweight MessageFormatter( logger.getCircularBuffer() );29 protected FlyweightLogMessage initialValue() { 30 return new FlyweightLogMessage( logger.getCircularBuffer() ); 29 31 } 30 32 }; 31 33 32 34 @Override 33 public synchronized MessageFormatter formatter( final String formatMessage) {34 final Simple MessageFormatter formatter = logger.formatter( formatMessage);35 public synchronized LogMessage message( final String messageFormat ) { 36 final SimpleLogMessage formatter = logger.message( messageFormat ); 35 37 final int formatId = formatter.formatId(); 36 38 final String format = formatter.format(); 37 39 final int argumentsCount = formatter.argumentsCount(); 38 40 39 return new ThreadLocal Formatter(41 return new ThreadLocalLog( 40 42 format, 41 43 formatId, … … 53 55 54 56 55 private final class ThreadLocal Formatter implements MessageFormatter{57 private final class ThreadLocalLog implements LogMessage { 56 58 57 59 private final String format; … … 59 61 private final int argumentsCount; 60 62 61 private ThreadLocal Formatter( final String format,62 63 63 private ThreadLocalLog( final String format, 64 final int formatId, 65 final int argumentsCount ) { 64 66 this.formatId = formatId; 65 67 this.format = format; … … 68 70 69 71 @Override 70 public Fluent Formatter with( final double value ) {72 public FluentLogBuilder with( final double value ) { 71 73 return setupLocal().with( value ); 72 74 } 73 75 74 76 @Override 75 public Fluent Formatter with( final long value ) {77 public FluentLogBuilder with( final long value ) { 76 78 return setupLocal().with( value ); 77 79 } 78 80 79 81 @Override 80 public void submit() {81 setupLocal(). submit();82 public void log() { 83 setupLocal().log(); 82 84 } 83 85 84 private Flyweight MessageFormattersetupLocal() {85 final Flyweight MessageFormatterformatter = holder.get();86 private FlyweightLogMessage setupLocal() { 87 final FlyweightLogMessage formatter = holder.get(); 86 88 formatter.setup( format, formatId, argumentsCount ); 87 89 return formatter; -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/formatters/AbstractLogBuilder.java
r587 r589 1 package com.db.logger.api.impl.logger ;1 package com.db.logger.api.impl.logger.formatters; 2 2 3 import com.db.logger.api.MessageFormatter; 4 import com.google.common.base.Preconditions; 3 import com.db.logger.api.FluentLogBuilder; 4 import com.db.logger.api.LogMessage; 5 import com.db.logger.api.impl.logger.CircularBuffer; 6 import com.db.logger.api.impl.logger.RecordHelper; 7 import net.jcip.annotations.NotThreadSafe; 5 8 6 9 import static com.db.logger.api.impl.logger.DemultiplexingSequencer.INVALID_INDEX; 7 10 import static com.db.logger.api.impl.logger.RecordHelper.RecordType.LOG_RECORD; 11 import static com.google.common.base.Preconditions.checkArgument; 8 12 import static com.google.common.base.Preconditions.checkState; 9 13 … … 12 16 * created 05.12.13 at 0:52 13 17 */ 14 public abstract class BaseMessageFormatter implements MessageFormatter { 18 @NotThreadSafe 19 public abstract class AbstractLogBuilder implements FluentLogBuilder { 15 20 public static final int NOT_SET = -1; 16 21 17 22 private final CircularBuffer buffer; 18 23 19 pr ivate int argumentIndex = 0;20 pr ivate long position = 0;24 protected int argumentIndex = NOT_SET; 25 protected long position = INVALID_INDEX; 21 26 22 public BaseMessageFormatter( final CircularBuffer circularBuffer ) { 23 this.buffer = circularBuffer; 27 public AbstractLogBuilder( final CircularBuffer buffer ) { 28 checkArgument( buffer != null, "buffer can't be null" ); 29 this.buffer = buffer; 24 30 } 25 31 26 32 @Override 27 public BaseMessageFormatter with( final long value ) { 28 //TODO conditions are costy! 29 ensureStarted(); 30 if( position == INVALID_INDEX ) { 31 return this; 32 } 33 public FluentLogBuilder with( final double value ) { 34 return with( Double.doubleToLongBits( value ) ); 35 } 36 37 @Override 38 public FluentLogBuilder with( final long value ) { 39 checkState( position != INVALID_INDEX, "Not started" ); 33 40 // checkState( 34 41 // argumentIndex < argumentsCount(), … … 47 54 48 55 @Override 49 public BaseMessageFormatter with( final double value ) { 50 return with( Double.doubleToLongBits( value ) ); 51 } 52 53 @Override 54 public void submit() { 55 //TODO conditions are costy! 56 ensureStarted(); 57 if( position == INVALID_INDEX ) { 58 return; 59 } 56 public void log() { 57 checkState( position != INVALID_INDEX, "Not started" ); 60 58 try { 61 59 // checkState( … … 77 75 } 78 76 79 private void ensureStarted() { 80 if( argumentIndex == NOT_SET ) { 81 position = buffer.claim( 82 argumentsCount() + 1 //1 for header 83 ); 84 argumentIndex = 0; 85 } 77 protected void start() { 78 checkState( argumentIndex == NOT_SET, "Can't start -- not submitted yet" ); 79 80 position = buffer.claim( argumentsCount() + 1 );//1 for header 81 82 argumentIndex = 0; 86 83 } 87 84 88 public abstract int formatId(); 85 protected abstract int formatId(); 86 87 protected abstract int argumentsCount(); 89 88 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/formatters/FlyweightLogMessage.java
r587 r589 1 package com.db.logger.api.impl.logger; 1 package com.db.logger.api.impl.logger.formatters; 2 3 import com.db.logger.api.LogMessage; 4 import com.db.logger.api.impl.logger.CircularBuffer; 2 5 3 6 /** … … 5 8 * created 20.11.13 at 23:48 6 9 */ 7 public class Flyweight MessageFormatter extends BaseMessageFormatter{10 public class FlyweightLogMessage extends AbstractLogBuilder implements LogMessage { 8 11 9 12 private String format; … … 12 15 private int argumentsCount; 13 16 14 public Flyweight MessageFormatter( final CircularBuffer circularBuffer ) {17 public FlyweightLogMessage( final CircularBuffer circularBuffer ) { 15 18 super( circularBuffer ); 16 19 } -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/formatters/RawLogMessage.java
r587 r589 1 package com.db.logger.api.impl.logger ;1 package com.db.logger.api.impl.logger.formatters; 2 2 3 import com.db.logger.api.MessageFormatter; 4 import com.db.logger.api.impl.FluentFormatter; 5 import com.google.common.base.Preconditions; 3 import com.db.logger.api.LogMessage; 4 import com.db.logger.api.FluentLogBuilder; 5 import com.db.logger.api.impl.logger.CircularBuffer; 6 import com.db.logger.api.impl.logger.RecordHelper; 6 7 7 import static com.db.logger.api.impl.logger. BaseMessageFormatter.NOT_SET;8 import static com.db.logger.api.impl.logger.formatters.AbstractLogBuilder.NOT_SET; 8 9 import static com.db.logger.api.impl.logger.DemultiplexingSequencer.INVALID_INDEX; 9 10 import static com.db.logger.api.impl.logger.RecordHelper.RecordType.LOG_RECORD; … … 14 15 * created 20.11.13 at 23:48 15 16 */ 16 public final class FastMessageFormatter implements MessageFormatter {17 public final class RawLogMessage implements LogMessage, FluentLogBuilder { 17 18 18 19 private final CircularBuffer buffer; … … 26 27 private final int argumentsCount; 27 28 28 public FastMessageFormatter( final String format,29 30 31 29 public RawLogMessage( final String format, 30 final int formatId, 31 final int argumentsCount, 32 final CircularBuffer circularBuffer ) { 32 33 this.buffer = circularBuffer; 33 34 this.format = format; … … 51 52 } 52 53 53 public FluentFormatter start() { 54 checkState( argumentIndex == NOT_SET, 55 "Submit first!" ); 54 public FluentLogBuilder start() { 55 checkState( argumentIndex == NOT_SET, "Submit first!" ); 56 56 position = buffer.claim( argumentsCount + 1 );//1 for header 57 checkState( position != INVALID_INDEX, "Can't claim position" ); 57 58 argumentIndex = 0; 58 59 return this; … … 61 62 62 63 @Override 63 public FluentFormatter with( final long value ) { 64 if( position == INVALID_INDEX ) { 65 return this; 66 } 64 public FluentLogBuilder with( final long value ) { 65 checkState( position != INVALID_INDEX, "Not started" ); 67 66 // checkState( 68 67 // argumentIndex < argumentsCount(), … … 81 80 82 81 @Override 83 public Fluent Formatter with( final double value ) {82 public FluentLogBuilder with( final double value ) { 84 83 return with( Double.doubleToLongBits( value ) ); 85 84 } 86 85 87 86 @Override 88 public void submit() { 89 if( position == INVALID_INDEX ) { 90 return; 91 } 87 public void log() { 88 checkState( position != INVALID_INDEX, "Not started" ); 92 89 try { 93 90 // checkState( -
Tests/JAVA/logger/src/main/java/com/db/logger/api/impl/logger/formatters/SimpleLogMessage.java
r586 r589 1 package com.db.logger.api.impl.logger ;1 package com.db.logger.api.impl.logger.formatters; 2 2 3 import com.db.logger.api.MessageFormatter; 3 import com.db.logger.api.FluentLogBuilder; 4 import com.db.logger.api.LogMessage; 5 import com.db.logger.api.impl.logger.CircularBuffer; 6 import net.jcip.annotations.NotThreadSafe; 4 7 5 import static com.db.logger.api.impl.logger.DemultiplexingSequencer.INVALID_INDEX;6 import static com.db.logger.api.impl.logger.RecordHelper.RecordType.LOG_RECORD;7 8 import static com.google.common.base.Preconditions.checkState; 8 9 … … 11 12 * created 20.11.13 at 23:48 12 13 */ 13 public final class SimpleMessageFormatter extends BaseMessageFormatter { 14 @NotThreadSafe 15 public final class SimpleLogMessage implements LogMessage { 14 16 15 17 private final String format; … … 18 20 private final int argumentsCount; 19 21 20 public SimpleMessageFormatter( final String format, 21 final int formatId, 22 final int argumentsCount, 23 final CircularBuffer circularBuffer ) { 24 super( circularBuffer ); 22 private final AbstractLogBuilder builder; 23 24 25 public SimpleLogMessage( final String format, 26 final int formatId, 27 final int argumentsCount, 28 final CircularBuffer circularBuffer ) { 29 builder = new AbstractLogBuilder( circularBuffer ) { 30 @Override 31 protected int formatId() { 32 return formatId; 33 } 34 35 @Override 36 protected int argumentsCount() { 37 return argumentsCount; 38 } 39 }; 25 40 this.format = format; 26 41 27 42 this.formatId = formatId; 28 43 this.argumentsCount = argumentsCount; 44 } 45 46 @Override 47 public FluentLogBuilder with( final double value ) { 48 builder.start(); 49 return builder.with( value ); 50 } 51 52 @Override 53 public FluentLogBuilder with( final long value ) { 54 builder.start(); 55 return builder.with( value ); 56 } 57 58 @Override 59 public void log() { 60 builder.start(); 61 builder.log(); 29 62 } 30 63 … … 42 75 return argumentsCount; 43 76 } 44 45 77 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/BufferWriteAndDrainBenchmark.java
r586 r589 12 12 import org.openjdk.jmh.logic.BlackHole; 13 13 14 import static com.db.logger.api.impl.logger.RecordHelper.NOT_SET; 15 14 16 /** 15 17 * @author ruslan … … 24 26 public static final int WRITER_BACKOFF = Integer.getInteger( "writer-backoff", 20 ); 25 27 26 public static final WaitingStrategy WAITING_STRATEGY = new WaitingStrategy.LimitedSpinning( 1024 *128 );28 public static final WaitingStrategy WAITING_STRATEGY = new WaitingStrategy.LimitedSpinning( 1024 * 128 ); 27 29 28 30 public static final AtomicInteger ID_GENERATOR = new AtomicInteger( 1 ); … … 61 63 final long header = buffer.getVolatile( pos ); 62 64 if( header > 0 ) { 63 buffer.put( pos, -1);65 buffer.put( pos, NOT_SET ); 64 66 break; 65 67 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/FastLoggerWithSimpleLogMessageBenchmark.java
r587 r589 5 5 import java.util.concurrent.atomic.AtomicInteger; 6 6 7 import com.db.logger.api.impl.FluentFormatter; 7 import com.db.logger.api.FluentLogBuilder; 8 import com.db.logger.api.LogMessage; 8 9 import com.db.logger.api.impl.logger.*; 9 10 import com.db.logger.api.impl.logger.buffer.DirectAccessLongBuffer; 10 11 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 12 import com.db.logger.api.impl.logger.formatters.SimpleLogMessage; 11 13 import org.apache.log4j.BasicConfigurator; 12 14 import org.apache.log4j.Logger; … … 25 27 @OutputTimeUnit( TimeUnit.NANOSECONDS ) 26 28 @State( Scope.Group ) 27 public class SimpleFastLoggerBenchmark {28 private static final Logger log = Logger.getLogger( SimpleFastLoggerBenchmark.class );29 public class FastLoggerWithSimpleLogMessageBenchmark { 30 private static final Logger log = Logger.getLogger( FastLoggerWithSimpleLogMessageBenchmark.class ); 29 31 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 30 32 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line … … 82 84 /*=============================================================================*/ 83 85 @GenerateMicroBenchmark 86 @Threads( 3 ) 84 87 @Group( "loggingAndPayload" ) 85 88 public void writeFormatted( final ThreadState ts ) { 86 if( ts. formatter== null ) {89 if( ts.logMessage == null ) { 87 90 ts.setup( this ); 88 91 } 89 FluentFormatter formatter = ts.formatter;90 92 final int count = CELLS_PER_RECORD; 91 for( int i = 0; i < count; i++ ) { 92 formatter = formatter.with( ( long ) i ); 93 FluentLogBuilder logBuilder = ts.logMessage.with( 4d ); 94 for( int i = 1; i < count; i++ ) { 95 logBuilder = logBuilder.with( ( long ) i ); 93 96 } 94 formatter.submit();97 logBuilder.log(); 95 98 96 99 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 101 104 public final int id = ID_GENERATOR.incrementAndGet(); 102 105 103 public SimpleMessageFormatter formatter;106 public LogMessage logMessage; 104 107 105 public void setup( final SimpleFastLoggerBenchmark b ) {106 formatter = b.logger.formatter( id + " %d %f %d %f %d %f %f %f" );108 public void setup( final FastLoggerWithSimpleLogMessageBenchmark b ) { 109 logMessage = b.logger.message( id + " %d %f %d %f %d %f %f %f" ); 107 110 } 108 111 } 109 112 110 113 public static void main( final String[] args ) throws Exception { 111 final SimpleFastLoggerBenchmark benchmark = new SimpleFastLoggerBenchmark();114 final FastLoggerWithSimpleLogMessageBenchmark benchmark = new FastLoggerWithSimpleLogMessageBenchmark(); 112 115 113 116 benchmark.setup(); -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/FastLoggerWithThreadLocalLogMessageBenchmark.java
r587 r589 5 5 import java.util.concurrent.atomic.AtomicInteger; 6 6 7 import com.db.logger.api. MessageFormatter;8 import com.db.logger.api. impl.FluentFormatter;7 import com.db.logger.api.LogMessage; 8 import com.db.logger.api.FluentLogBuilder; 9 9 import com.db.logger.api.impl.logger.*; 10 10 import com.db.logger.api.impl.logger.buffer.DirectAccessLongBuffer; … … 26 26 @OutputTimeUnit( TimeUnit.NANOSECONDS ) 27 27 @State( Scope.Group ) 28 public class ThreadLocalFastLoggerBenchmark {29 private static final Logger log = Logger.getLogger( ThreadLocalFastLoggerBenchmark.class );28 public class FastLoggerWithThreadLocalLogMessageBenchmark { 29 private static final Logger log = Logger.getLogger( FastLoggerWithThreadLocalLogMessageBenchmark.class ); 30 30 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 31 31 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line … … 88 88 ts.setup( this ); 89 89 } 90 Fluent Formatter formatter = ts.formatter;90 FluentLogBuilder logBuilder = ts.formatter.with( 5d ); 91 91 final int count = CELLS_PER_RECORD; 92 for( int i = 0; i < count; i++ ) {93 formatter = formatter.with( ( long ) i );92 for( int i = 1; i < count; i++ ) { 93 logBuilder = logBuilder.with( ( long ) i ); 94 94 } 95 formatter.submit();95 logBuilder.log(); 96 96 97 97 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 102 102 public final int id = ID_GENERATOR.incrementAndGet(); 103 103 104 public MessageFormatterformatter;104 public LogMessage formatter; 105 105 106 public void setup( final ThreadLocalFastLoggerBenchmark b ) {107 formatter = b.logger. formatter( id + " %d %f %d %f %d %f %f %f" );106 public void setup( final FastLoggerWithThreadLocalLogMessageBenchmark b ) { 107 formatter = b.logger.message( id + " %d %f %d %f %d %f %f %f" ); 108 108 } 109 109 } 110 110 111 111 public static void main( final String[] args ) throws Exception { 112 final ThreadLocalFastLoggerBenchmark benchmark = new ThreadLocalFastLoggerBenchmark();112 final FastLoggerWithThreadLocalLogMessageBenchmark benchmark = new FastLoggerWithThreadLocalLogMessageBenchmark(); 113 113 114 114 benchmark.setup(); -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/Log4j20Benchmark.java
r586 r589 75 75 final Object[] arguments = new Object[CELLS_PER_RECORD - 1]; 76 76 logger.info( "", arguments ); 77 // final int count = formatter.argumentsCount();77 // final int count = logMessage.argumentsCount(); 78 78 // for( int i = 0; i < count; i++ ) { 79 // formatter = formatter.with( ( long ) i );79 // logMessage = logMessage.with( ( long ) i ); 80 80 // } 81 // formatter.submit();81 // logMessage.submit(); 82 82 83 83 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 89 89 public void readingDrainer() { 90 90 try { 91 // sequencer.drainTo( DRAIN_AND_READ);91 // sequencer.drainTo( readingConsumer ); 92 92 // BlackHole.consumeCPU( 100 ); 93 93 } catch( Throwable e ) { -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/RawLogMessageWriteAndDrainBenchmark.java
r587 r589 4 4 import java.util.concurrent.atomic.AtomicInteger; 5 5 6 import com.db.logger.api. impl.FluentFormatter;6 import com.db.logger.api.FluentLogBuilder; 7 7 import com.db.logger.api.impl.logger.*; 8 8 import com.db.logger.api.impl.logger.buffer.DirectAccessLongBuffer; 9 9 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 10 import com.db.logger.api.impl.logger.formatters.RawLogMessage; 10 11 import org.openjdk.jmh.annotations.*; 11 12 import org.openjdk.jmh.logic.BlackHole; 12 13 13 import static com.db.logger.api.impl.logger.RecordHelper.*;14 15 14 /** 15 * RawLogMessage -- with explicit .start() method 16 * 16 17 * @author ruslan 17 18 * created 22.11.13 at 20:04 … … 20 21 @OutputTimeUnit( TimeUnit.NANOSECONDS ) 21 22 @State( Scope.Group ) 22 public class FastFormatterWriteAndDrainBenchmark {23 public class RawLogMessageWriteAndDrainBenchmark { 23 24 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 24 25 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line … … 36 37 public DemultiplexingSequencer sequencer; 37 38 38 public DemultiplexingSequencer.Drainer DRAIN_AND_READ;39 public DemultiplexingSequencer.Drainer readingConsumer; 39 40 40 41 @Setup … … 43 44 sequencer = new DemultiplexingSequencer( LENGTH ); 44 45 45 DRAIN_AND_READ = new ConsumingDrainer();46 readingConsumer = new ConsumingDrainer( buffer ); 46 47 } 47 48 … … 72 73 } 73 74 final int count = ts.formatter.argumentsCount(); 74 FluentFormatter formatter = ts.formatter.start(); 75 for( int i = 0; i < count; i++ ) { 76 formatter = formatter.with( ( long ) i ); 75 FluentLogBuilder logBuilder = ts.formatter.start(); 76 logBuilder = logBuilder.with( 5d ); 77 for( int i = 1; i < count; i++ ) { 78 logBuilder = logBuilder.with( ( long ) i ); 77 79 } 78 formatter.submit();80 logBuilder.log(); 79 81 80 82 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 86 88 public void readingDrainer() { 87 89 try { 88 sequencer.drainTo( DRAIN_AND_READ);90 sequencer.drainTo( readingConsumer ); 89 91 // BlackHole.consumeCPU( 100 ); 90 92 } catch( Throwable e ) { … … 97 99 public final int id = ID_GENERATOR.incrementAndGet(); 98 100 99 public FastMessageFormatterformatter;101 public RawLogMessage formatter; 100 102 101 public void setup( final FastFormatterWriteAndDrainBenchmark b ) {102 formatter = new FastMessageFormatter(103 public void setup( final RawLogMessageWriteAndDrainBenchmark b ) { 104 formatter = new RawLogMessage( 103 105 "", 104 106 id, … … 110 112 111 113 public static void main( final String[] args ) throws Exception { 112 final FastFormatterWriteAndDrainBenchmark benchmark = new FastFormatterWriteAndDrainBenchmark();114 final RawLogMessageWriteAndDrainBenchmark benchmark = new RawLogMessageWriteAndDrainBenchmark(); 113 115 114 116 benchmark.setup(); … … 140 142 } 141 143 142 private class ConsumingDrainer implements DemultiplexingSequencer.Drainer {143 private static final int SPINS_PER_TURN = 256;144 145 private int spinsAvailable;146 private final BlackHole hole = new BlackHole();147 148 @Override149 public int available( final long startSequence,150 final long sentinelSequence ) {151 spinsAvailable = SPINS_PER_TURN;152 for( long pos = startSequence; pos < sentinelSequence; pos++ ) {153 final long header = readHeader( pos );154 if( !isValidHeader( header ) ) {155 return ( int ) ( pos - startSequence );156 }157 final RecordType type = type( header );158 final int formatId = formatId( header );159 final int argumentsCount = argumentsCount( header );160 for( int i = 1; i <= argumentsCount; i++ ) {161 hole.consume( buffer.get( pos + i ) );162 buffer.put( pos + i, -1 );//needs to reclaim all!163 }164 buffer.put( pos, -1 );165 pos += argumentsCount;166 }167 return ( int ) ( sentinelSequence - startSequence );168 }169 170 private long readHeader( final long pos ) {171 for(; spinsAvailable >= 0; spinsAvailable-- ) {172 final long header = buffer.getVolatile( pos );173 if( isValidHeader( header ) ) {174 return header;175 }176 }177 return -1;178 }179 }180 144 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/SimpleLogMessageWriteAndDrainBenchmark.java
r587 r589 4 4 import java.util.concurrent.atomic.AtomicInteger; 5 5 6 import com.db.logger.api. impl.FluentFormatter;6 import com.db.logger.api.FluentLogBuilder; 7 7 import com.db.logger.api.impl.logger.*; 8 8 import com.db.logger.api.impl.logger.buffer.DirectAccessLongBuffer; 9 9 import com.db.logger.api.impl.logger.buffer.ILongsBuffer; 10 import com.db.logger.api.impl.logger.formatters.SimpleLogMessage; 10 11 import org.openjdk.jmh.annotations.*; 11 12 import org.openjdk.jmh.logic.BlackHole; … … 20 21 @OutputTimeUnit( TimeUnit.NANOSECONDS ) 21 22 @State( Scope.Group ) 22 public class Simple FormatterWriteAndDrainBenchmark {23 public class SimpleLogMessageWriteAndDrainBenchmark { 23 24 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 24 25 public static final int CELLS_PER_RECORD = Integer.getInteger( "cells-per-record", 8 );//8longs = 1 cache line … … 36 37 public DemultiplexingSequencer sequencer; 37 38 38 public DemultiplexingSequencer.Drainer DRAIN_AND_READ;39 public DemultiplexingSequencer.Drainer readingConsumer; 39 40 40 41 @Setup … … 43 44 sequencer = new DemultiplexingSequencer( LENGTH ); 44 45 45 DRAIN_AND_READ = new ConsumingDrainer();46 readingConsumer = new ConsumingDrainer( buffer ); 46 47 } 47 48 … … 72 73 } 73 74 final int count = ts.formatter.argumentsCount(); 74 Fluent Formatter formatter = ts.formatter;75 for( int i = 0; i < count; i++ ) {76 formatter = formatter.with( ( long ) i );75 FluentLogBuilder logBuilder = ts.formatter.with( 5d ); 76 for( int i = 1; i < count; i++ ) { 77 logBuilder = logBuilder.with( ( long ) i ); 77 78 } 78 formatter.submit();79 logBuilder.log(); 79 80 80 81 BlackHole.consumeCPU( WRITER_BACKOFF ); … … 86 87 public void readingDrainer() { 87 88 try { 88 sequencer.drainTo( DRAIN_AND_READ);89 sequencer.drainTo( readingConsumer ); 89 90 // BlackHole.consumeCPU( 100 ); 90 91 } catch( Throwable e ) { … … 97 98 public final int id = ID_GENERATOR.incrementAndGet(); 98 99 99 public Simple MessageFormatterformatter;100 public SimpleLogMessage formatter; 100 101 101 public void setup( final Simple FormatterWriteAndDrainBenchmark b ) {102 formatter = new Simple MessageFormatter(102 public void setup( final SimpleLogMessageWriteAndDrainBenchmark b ) { 103 formatter = new SimpleLogMessage( 103 104 "", 104 105 id, … … 110 111 111 112 public static void main( final String[] args ) throws Exception { 112 final Simple FormatterWriteAndDrainBenchmark benchmark = new SimpleFormatterWriteAndDrainBenchmark();113 final SimpleLogMessageWriteAndDrainBenchmark benchmark = new SimpleLogMessageWriteAndDrainBenchmark(); 113 114 114 115 benchmark.setup(); … … 139 140 Thread.sleep( 300000 ); 140 141 } 141 142 private class ConsumingDrainer implements DemultiplexingSequencer.Drainer {143 private static final int SPINS_PER_TURN = 256;144 145 private int spinsAvailable;146 private final BlackHole hole = new BlackHole();147 148 @Override149 public int available( final long startSequence,150 final long sentinelSequence ) {151 spinsAvailable = SPINS_PER_TURN;152 for( long pos = startSequence; pos < sentinelSequence; pos++ ) {153 final long header = readHeader( pos );154 if( !isValidHeader( header ) ) {155 return ( int ) ( pos - startSequence );156 }157 final RecordHelper.RecordType type = type( header );158 final int formatId = formatId( header );159 final int argumentsCount = argumentsCount( header );160 for( int i = 1; i <= argumentsCount; i++ ) {161 hole.consume( buffer.get( pos + i ) );162 buffer.put( pos + i, -1 );//needs to reclaim all!163 }164 buffer.put( pos, -1 );165 pos += argumentsCount;166 }167 return ( int ) ( sentinelSequence - startSequence );168 }169 170 private long readHeader( final long pos ) {171 for(; spinsAvailable >= 0; spinsAvailable-- ) {172 final long header = buffer.getVolatile( pos );173 if( isValidHeader( header ) ) {174 return header;175 }176 }177 return -1;178 }179 }180 142 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/AtomicBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.util.concurrent.TimeUnit; 4 4 import java.util.concurrent.atomic.AtomicInteger; 5 5 6 import com.db.logger.api.impl.logger.DemultiplexingSequencer;7 import com.db.logger.api.impl.logger.WaitingStrategy;8 6 import org.openjdk.jmh.annotations.*; 9 7 import org.openjdk.jmh.logic.BlackHole; 10 import sun.misc.Unsafe;11 8 12 9 /** -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/IOBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.io.*; -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/SequencerBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.util.concurrent.TimeUnit; … … 6 6 import com.db.logger.api.impl.logger.DemultiplexingSequencer; 7 7 import com.db.logger.api.impl.logger.WaitingStrategy; 8 import org.apache.log4j.BasicConfigurator; 9 import org.apache.log4j.Logger; 8 10 import org.openjdk.jmh.annotations.*; 9 11 import org.openjdk.jmh.logic.BlackHole; … … 11 13 /** 12 14 * Here we measure raw sequencer performance: just position claiming/reclaiming 15 * <p/> 16 * TODO: sometimes hangs! why? 13 17 * 14 18 * @author ruslan … … 19 23 @State( Scope.Group ) 20 24 public class SequencerBenchmark { 25 private static final Logger log = Logger.getLogger( SequencerBenchmark.class ); 26 21 27 public static final int LENGTH = Integer.getInteger( "length", 1 << 14 ); 22 28 public static final int CELLS_PER_RECORD = Integer.getInteger( "record-size", 8 );//8longs = 1 cache line … … 26 32 27 33 static { 34 BasicConfigurator.configure(); 28 35 System.out.printf( "len=%d, record=%d, payload=%d\n", LENGTH, CELLS_PER_RECORD, WRITER_BACKOFF ); 29 36 } … … 66 73 /*=============================================================================*/ 67 74 @GenerateMicroBenchmark 68 @Group( " write3AndDummyDrainAndPayload" )75 @Group( "claim3AndPayloadAndDrain1Dummy" ) 69 76 @Threads( 3 )//actually it's (CORES-1) 70 public void writer( final ThreadState ts ) {71 writeEntry( ts.id, ts.count );77 public void claimer( final ThreadState ts ) { 78 claimEntry( ts.id, ts.count ); 72 79 BlackHole.consumeCPU( WRITER_BACKOFF ); 73 80 } 74 81 75 82 @GenerateMicroBenchmark 76 @Group( " write3AndDummyDrainAndPayload" )83 @Group( "claim3AndPayloadAndDrain1Dummy" ) 77 84 @Threads( 1 ) 78 public void d ummyDrainer() {85 public void drainer() { 79 86 try { 80 87 sequencer.drainTo( DRAIN_DUMMY ); … … 87 94 /*=============================================================================*/ 88 95 89 private long writeEntry( final int writerId,96 private long claimEntry( final int writerId, 90 97 final int cellsCount ) { 91 98 return sequencer.claim( cellsCount, WAITING_STRATEGY ); … … 103 110 benchmark.setup(); 104 111 112 final int BATCH = 1000000; 105 113 final ThreadState[] states = new ThreadState[3]; 106 114 for( int i = 0; i < states.length; i++ ) { … … 110 118 @Override 111 119 public void run() { 112 for(; ; ) { 113 benchmark.writer( state ); 120 for( int turn = 0; ; turn += BATCH ) { 121 for( int i = 0; i < BATCH; i++ ) { 122 benchmark.claimer( state ); 123 } 124 log.info( "Thread " + state.id + ": " + turn ); 114 125 } 115 126 } … … 120 131 @Override 121 132 public void run() { 133 122 134 for(; ; ) { 123 benchmark.d ummyDrainer();135 benchmark.drainer(); 124 136 } 125 137 } -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/ThreadLocalBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.util.concurrent.TimeUnit; -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/TimestampersBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.util.concurrent.TimeUnit; -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/UnsafeAtomicBenchmark.java
r587 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.lang.reflect.Field; 4 4 import java.util.concurrent.TimeUnit; 5 import java.util.concurrent.atomic.AtomicInteger;6 5 7 6 import com.db.logger.api.impl.logger.UnsafeHelper; -
Tests/JAVA/logger/src/main/java/com/db/logger/benchmarks/helpers/VolatileBenchmark.java
r586 r589 1 package com.db.logger.benchmarks ;1 package com.db.logger.benchmarks.helpers; 2 2 3 3 import java.util.concurrent.TimeUnit; 4 import java.util.concurrent.atomic.AtomicInteger;5 4 6 5 import org.openjdk.jmh.annotations.*; -
Tests/JAVA/logger/src/main/java/com/db/logger/io/storage/RawWriter.java
r581 r589 24 24 * created 11/14/13 at 10:16 AM 25 25 */ 26 public interface RawWriter extends Flushable, Closeable , AutoCloseable{26 public interface RawWriter extends Flushable, Closeable/*, AutoCloseable*/ { 27 27 28 28 public ByteBuffer buffer(); -
Tests/JAVA/logger/src/main/java/com/db/logger/io/storage/RecordWriter.java
r581 r589 9 9 * created 11/14/13 at 10:17 AM 10 10 */ 11 public interface RecordWriter<T> extends Closeable, Flushable , AutoCloseable{11 public interface RecordWriter<T> extends Closeable, Flushable/*, AutoCloseable*/ { 12 12 /** @return metadata stored alongside the storage. Can't be modified */ 13 13 public RecordStorage.Metadata metadata();
Note: See TracChangeset
for help on using the changeset viewer.