/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package org.jalview;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
/*
* A class to benchmark hidden columns performance
*/
@Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Fork(1)
public class HiddenColumnsBenchmark
{
/*
* State with multiple hidden columns and a start position set
*/
@State(Scope.Thread)
public static class HiddenColsAndStartState
{
@Param({ "300", "10000", "100000" })
public int maxcols;
@Param({ "1", "50", "90" })
public int startpcnt; // position as percentage of maxcols
@Param({ "1", "15", "100" })
public int hide;
HiddenColumns h = new HiddenColumns();
Random rand = new Random();
public int hiddenColumn;
public int visibleColumn;
@Setup
public void setup()
{
rand.setSeed(1234);
int lastcol = 0;
while (lastcol < maxcols)
{
int count = rand.nextInt(100);
lastcol += count;
h.hideColumns(lastcol, lastcol + hide);
lastcol += hide;
}
// make sure column at start is hidden
hiddenColumn = (int) (maxcols * startpcnt / 100.0);
h.hideColumns(hiddenColumn, hiddenColumn);
// and column after start is visible
ColumnSelection sel = new ColumnSelection();
h.revealHiddenColumns(hiddenColumn + hide, sel);
visibleColumn = hiddenColumn + hide;
System.out.println("Maxcols: " + maxcols + " HiddenCol: "
+ hiddenColumn + " Hide: " + hide);
System.out.println("Number of hidden columns: " + h.getSize());
}
}
/* Convention: functions in alphabetical order */
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public int benchAdjustForHiddenColumns(HiddenColsAndStartState tstate)
{
return tstate.h.adjustForHiddenColumns(tstate.visibleColumn);
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public int benchFindColumnPosition(HiddenColsAndStartState tstate)
{
return tstate.h.findColumnPosition(tstate.visibleColumn);
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public List benchFindHiddenRegionPositions(
HiddenColsAndStartState tstate)
{
return tstate.h.findHiddenRegionPositions();
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public ArrayList benchGetHiddenColumnsCopy(
HiddenColsAndStartState tstate)
{
return tstate.h.getHiddenColumnsCopy();
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public int benchGetSize(HiddenColsAndStartState tstate)
{
return tstate.h.getSize();
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public HiddenColumns benchHideCols(HiddenColsAndStartState tstate)
{
tstate.h.hideColumns(tstate.visibleColumn, tstate.visibleColumn + 2000);
return tstate.h;
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public boolean benchIsVisible(HiddenColsAndStartState tstate)
{
return tstate.h.isVisible(tstate.hiddenColumn);
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public HiddenColumns benchReveal(HiddenColsAndStartState tstate)
{
ColumnSelection sel = new ColumnSelection();
tstate.h.revealHiddenColumns(tstate.hiddenColumn, sel);
return tstate.h;
}
@Benchmark
@BenchmarkMode({ Mode.Throughput })
public HiddenColumns benchRevealAll(HiddenColsAndStartState tstate)
{
ColumnSelection sel = new ColumnSelection();
tstate.h.revealAllHiddenColumns(sel);
return tstate.h;
}
}