/** * Copyright (c) 2002-2011 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.bench.cases.mixedload; import java.io.PrintStream; import java.util.StringTokenizer; /** * In memory representation of a set of statistics from a bench run. Comparable * with its kind for sorting purposes and performance degradation detection. * Provides methods for reading in and writing out from/to file. */ public class Stats implements Comparable<Stats> { private final String name; private double avgReadsPerSec; private double avgWritePerSec; private double peakReadsPerSec; private double peakWritesPerSec; private double sustainedReadsPerSec; private double sustainedWritesPerSec; public Stats( String name ) { this.name = name; } public double getAvgReadsPerSec() { return avgReadsPerSec; } public void setAvgReadsPerSec( double avgReadsPerSec ) { this.avgReadsPerSec = avgReadsPerSec; } public double getAvgWritePerSec() { return avgWritePerSec; } public void setAvgWritePerSec( double avgWritePerSec ) { this.avgWritePerSec = avgWritePerSec; } public double getPeakReadsPerSec() { return peakReadsPerSec; } public void setPeakReadsPerSec( double peakReadsPerSec ) { this.peakReadsPerSec = peakReadsPerSec; } public double getPeakWritesPerSec() { return peakWritesPerSec; } public void setPeakWritesPerSec( double peakWritesPerSec ) { this.peakWritesPerSec = peakWritesPerSec; } public double getSustainedReadsPerSec() { return sustainedReadsPerSec; } public void setSustainedReadsPerSec( double sustainedReadsPerSec ) { this.sustainedReadsPerSec = sustainedReadsPerSec; } public double getSustainedWritesPerSec() { return sustainedWritesPerSec; } public void setSustainedWritesPerSec( double sustainedWritesPerSec ) { this.sustainedWritesPerSec = sustainedWritesPerSec; } public String getName() { return name; } public void write( PrintStream out, boolean newLine ) { out.print( String.format( "%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f", name, avgReadsPerSec, avgWritePerSec, peakReadsPerSec, peakWritesPerSec, sustainedReadsPerSec, sustainedWritesPerSec ) ); if ( newLine ) { out.println(); } } @Override public int compareTo( Stats o ) { // NPE on purpose return this.name.compareTo( o.name ); } public static Stats parse( String line ) { Stats result = null; String nameToken, // The current version token readsToken, // The current reads per second token writesToken, // The current writes per second token peakReadsToken, // The current peak reads token peakWritesToken, // The current peak writes token sustainedReadsToken, // The current peak reads token sustainedWritesToken // The current peak writes token ; // The double values of the corresponding tokens double reads, writes, peakReads, peakWrites, sustainedReads, sustainedWrites; StringTokenizer tokenizer = new StringTokenizer( line, "\t" ); if ( tokenizer.countTokens() < 7 ) { return null; } // Grab the tokens nameToken = tokenizer.nextToken(); readsToken = tokenizer.nextToken(); writesToken = tokenizer.nextToken(); peakReadsToken = tokenizer.nextToken(); peakWritesToken = tokenizer.nextToken(); sustainedReadsToken = tokenizer.nextToken(); sustainedWritesToken = tokenizer.nextToken(); // Parse the integer values, check for validity try { reads = Double.valueOf( readsToken ); writes = Double.valueOf( writesToken ); peakReads = Double.valueOf( peakReadsToken ); peakWrites = Double.valueOf( peakWritesToken ); sustainedReads = Double.valueOf( sustainedReadsToken ); sustainedWrites = Double.valueOf( sustainedWritesToken ); } catch ( NumberFormatException e ) { // This is stupid but there is no other way return null; } result = new Stats( nameToken ); result.avgReadsPerSec = reads; result.avgWritePerSec = writes; result.peakReadsPerSec = peakReads; result.peakWritesPerSec = peakWrites; result.sustainedReadsPerSec = sustainedReads; result.sustainedWritesPerSec = sustainedWrites; return result; } }