Samples :: FAST Benchmark

FAST Benchmark Sample

Description

This is a FAST coder benchmark application.

Directory Contents

Item Description
conf/sample/FastBenchmark.properties sample configuration
conf/sample/cmeTemplate.xml CME templates
conf/logback.xml Logback logging facility configuration
conf/sample/fixDialect.xml FIX dialects
conf/sample/*.bin test data

Usage

  • Run the sample:
    • win: FastBenchmark.bat
    • linux: FastBenchmark.sh
  • Clean everything:
    • win: clean.bat
    • linux: clean.sh

Source Code

import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.engine.Engine;
import biz.onixs.fix.fast.FastVersion;
import biz.onixs.util.settings.PropertyBasedSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FastBenchmarkRunner {
    private static final Logger LOG = LoggerFactory.getLogger(FastBenchmarkRunner.class);

    public void run() {
        // Init FIX Engine
        final PropertyBasedSettings settings = new PropertyBasedSettings("sample/FastBenchmark.properties");
        final Engine engine = Engine.init(settings);
        //
        final Benchmarker benchmarker = new Benchmarker();
        //
        final DecodeBenchmark benchmark = new DecodeBenchmark();
        benchmark.setId("FastDec-0");
        benchmark.setFastTemplates("sample/cmeTemplate.xml");
        benchmark.setFastVersion(FastVersion.FAST_1_1);
        benchmark.setFixEngineProperties("sample/FastBenchmark.properties");
        benchmark.setFixVersion(Version.getById("CmeFix50"));
        benchmark.setIterationNumber(500000L);
        benchmark.setInputFile("sample/cmeSecurityDefinition_2007-11-21.txt");
        benchmarker.run(benchmark);
        //
        benchmark.setId("FastDec-1");
        benchmark.setInputFile("sample/cmeBinaryFastMessage2.txt");
        benchmarker.run(benchmark);
        //
        benchmark.setId("FastDec-2");
        benchmark.setInputFile("sample/CmeSnapshotFullRefresh.txt");
        benchmarker.run(benchmark);
        //
        // Shutdown FIX Engine
        engine.shutdown();
    }

    public static void main(final String[] args) {
        try {
            final FastBenchmarkRunner benchmarkRunner = new FastBenchmarkRunner();
            benchmarkRunner.run();
        } catch (final Throwable throwable) {
            LOG.error(throwable.getMessage(), throwable);
        }
    }
}

The following classes are used in the sample:

import biz.onixs.util.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Benchmarker {
    private static final Logger LOG = LoggerFactory.getLogger(Benchmarker.class);

    public Benchmarker() {
        LOG.debug(Utils.systemProperties2String());
    }

    public void run(final Benchmark benchmark) {
        boolean statusOK = true;
        LOG.info("Benchmark begin: {}", benchmark);
        final long iterationNum = benchmark.getIterationNumber();
        LOG.info("Iteration number: {}", iterationNum);
        try {
            benchmark.setUp();
        } catch (final Exception e) {
            LOG.error("Exception during 'setUp' step, stopping benchmark.", e);
            statusOK = false;
        }
        long startTime = 0L;
        long stopTime = 0L;
        if (statusOK) {
            long l = 0L;
            try {
                startTime = System.nanoTime();
                while (l < iterationNum) {
                    benchmark.doAction();
                    l++;
                }
                stopTime = System.nanoTime();
            } catch (final Exception e) {
                LOG.error("Exception on the iteration #{}, stopping benchmark.", l, e);
                statusOK = false;
            }
        }
        try {
            benchmark.tearDown();
        } catch (final Exception e) {
            LOG.error("Exception during 'tearDown' step.", e);
            statusOK = false;
        }
        if (statusOK) {
            final long deltaTime = stopTime - startTime;
            if (0L == deltaTime) {
                LOG.warn("Delta time is 0, please increase iteration number.");
            }
            LOG.info("Delta time in nanos: {}", deltaTime);
            final double speed = (iterationNum * 1000000000L) / ((double) deltaTime);
            LOG.info("Speed: {} it/sec", speed);
        }
        LOG.info("Benchmark end: {}", benchmark);
    }
}
import biz.onixs.fix.fast.Decoder;
import org.apache.commons.io.IOUtils;

import java.util.Base64;

public class DecodeBenchmark extends OnixsFastBenchmark {
    private byte[] inMsg = null;
    private Decoder decoder = null;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        inMsg = Base64.getDecoder().decode(IOUtils.toByteArray(getResourceLoader().getResource(getInputFile())));
        decoder = new Decoder(getTemplateStream(), getFastVersion(), getFixVersion());
    }

    @Override
    public void doAction() {
        decoder.decode(inMsg);
    }

    @Override
    public String toString() {
        return "DecodeBenchmark{" + toStringShort() + '}';
    }
}
import biz.onixs.fix.dictionary.Version;
import biz.onixs.fix.fast.FastVersion;
import biz.onixs.util.url.ResourceLoader;
import biz.onixs.util.url.ResourceLoaderUtil;

import java.io.InputStream;

public abstract class OnixsFastBenchmark extends AbstractFastBenchmark {
    private final ResourceLoader resourceLoader = ResourceLoaderUtil.DEFAULT_LOADER;
    private FastVersion fastVersion = null;
    private String fixEngineProperties = null;
    private Version fixVersion = null;

    public ResourceLoader getResourceLoader() {
        return resourceLoader;
    }

    public FastVersion getFastVersion() {
        return fastVersion;
    }

    public void setFastVersion(final FastVersion fastVersion) {
        this.fastVersion = fastVersion;
    }

    public String getFixEngineProperties() {
        return fixEngineProperties;
    }

    public void setFixEngineProperties(final String fixEngineProperties) {
        this.fixEngineProperties = fixEngineProperties;
    }

    public Version getFixVersion() {
        return fixVersion;
    }

    public void setFixVersion(final Version fixVersion) {
        this.fixVersion = fixVersion;
    }

    public InputStream getTemplateStream() {
        return resourceLoader.getResource(getFastTemplates());
    }

    @Override
    public void setUp() throws Exception {
    }

    @Override
    public void tearDown() {
    }

    @Override
    public String toStringShort() {
        return super.toStringShort() + ", fixVersion=" + fixVersion.getId() +
                ", fastVersion=" + fastVersion + '\'';
    }

    @Override
    public String toString() {
        return "FastBenchmark{" + toStringShort() + '}';
    }
}
public abstract class AbstractFastBenchmark extends AbstractBenchmark {
    private String fastTemplates = null;
    private String inputFile = null;

    public String getFastTemplates() {
        return fastTemplates;
    }

    public void setFastTemplates(final String fastTemplates) {
        this.fastTemplates = fastTemplates;
    }

    public String getInputFile() {
        return inputFile;
    }

    public void setInputFile(final String inputFile) {
        this.inputFile = inputFile;
    }

    @Override
    public String toStringShort() {
        return super.toStringShort() + ", fastTemplates='" + fastTemplates + '\'' + ", inputFile='" + inputFile + '\'';
    }

    @Override
    public String toString() {
        return "AbstractFastBenchmark{" + toStringShort() + '}';
    }
}
public abstract class AbstractBenchmark implements Benchmark {
    private String id = null;
    private long iterationNumber = 0L;

    public String getId() {
        return id;
    }

    public void setId(final String id) {
        this.id = id;
    }

    @Override
    public long getIterationNumber() {
        return iterationNumber;
    }

    public void setIterationNumber(final long iterationNumber) {
        this.iterationNumber = iterationNumber;
    }

    public String toStringShort() {
        return "id='" + id + '\'' + ", iterationNumber=" + iterationNumber;
    }

    @Override
    public String toString() {
        return "AbstractBenchmark{" + toStringShort() + '}';
    }
}
public interface Benchmark {
    void setUp() throws Exception;

    void doAction() throws Exception;

    void tearDown() throws Exception;

    long getIterationNumber();
}