Leve.Iteration @TearDown method called one too many times
Alex Averbuch
alex.averbuch at neotechnology.com
Mon Jul 25 13:27:13 UTC 2016
Hi,
I have a benchmark for measuring database index creation.
Summary:
* It is an expensive operation (5+ seconds per invocation), so
Mode.SingleShotTime is used
* The database runs 5 warmup iterations & 5 measurement iterations
* Each iteration must create an index from scratch, so the index must be
dropped/deleted between iterations
* To delete the index after each iteration a Level.Iteration @TearDown
method is used. Inside this method the index is dropped
Problem:
* It appears as though the Level.Iteration @TearDown method is being
called 1 more time than the @Benchmark method
* This causes the database (and benchmark) to crash, because the database
tries to delete an index that does not exist
When executing the benchmark code at the bottom of this email, the
following is written to console:
# Run progress: 0.00% complete, ETA 00:00:00
# Fork: 1 of 1
# Warmup Iteration 1:
CREATE
DROP
# Warmup Iteration 2:
CREATE
DROP
# Warmup Iteration 3:
CREATE
DROP
# Warmup Iteration 4:
CREATE
DROP
# Warmup Iteration 5:
CREATE
DROP
Iteration 1:
CREATE
DROP
Iteration 2:
CREATE
DROP
Iteration 3:
CREATE
DROP
Iteration 4:
CREATE
DROP
Iteration 5:
CREATE
DROP
DROP <--------- NOTICE THIS ADDITIONAL
"DROP"
Does this (extra DROP) make sense?
Is there any way to prevent it from happening?
Thanks in advance!
@State( Scope.Benchmark )
public class CreateIndex
{
protected Database db;
@Setup
public void setUp()
{
db = new Database();
// populate db
}
@TearDown
public void tearDown()
{
db.shutdown();
}
@TearDown( Level.Iteration )
public void dropIndex()
{
System.out.println("DROP");
try ( Transaction tx = db.beginTx() )
{
// drop index
tx.success();
}
}
@Benchmark
@BenchmarkMode( Mode.SingleShotTime )
public void createIndex()
{
System.out.println("CREATE");
try ( Transaction tx = db.beginTx() )
{
// create index
tx.success();
}
}
}
More information about the jmh-dev
mailing list