/*
* Copyright (C) ${year} Omry Yadan <${email}>
* All rights reserved.
*
* See https://github.com/omry/banana/blob/master/BSD-LICENSE for licensing information
*/
package net.yadan.banana.memory.block;
import java.util.Arrays;
import java.util.Collection;
import net.yadan.banana.memory.IBlockAllocator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(value = Parameterized.class)
public class Benchmark {
int m_pointers[];
IBlockAllocator m_blocks;
IBlockAllocator m_bigBlocks;
public Benchmark(int maxBlocks, int blockSize) {
m_blocks = new BlockAllocator(maxBlocks, blockSize);
m_bigBlocks = new BigBlockAllocator(maxBlocks, blockSize);
m_pointers = new int[maxBlocks];
cleanup();
}
@Parameters
public static Collection<Object[]> data() {
//@formatter:off
Object[][] data = new Object[][] {
{10 * 100, 4},
{10 * 100, 16},
};
return Arrays.asList(data);
}
//@formatter:on
@Before
public void init() {
}
@After
public void cleanup() {
m_blocks.clear();
m_bigBlocks.clear();
for (int i = 0; i < m_pointers.length; i++) {
m_pointers[i] = -1;
}
}
@Test
public void benchMallocFree_BlocksAllocator() {
benchMallocFree(m_blocks);
}
@Test
public void benchMallocFree_BigBlocksAllocator() {
benchMallocFree(m_bigBlocks);
}
@Test
public void benchReadWrite_BlocksAllocator() {
benchReadWrite(m_blocks);
}
@Test
public void benchReadWrite_BigBlocksAllocator() {
benchReadWrite(m_bigBlocks);
}
public void benchMallocFree(IBlockAllocator blocks) {
int iterations = 10000;
for (int k = 0; k < iterations; k++) {
for (int i = 0; i < blocks.maxBlocks(); i++) {
m_pointers[i] = blocks.malloc();
}
for (int i = 0; i < blocks.maxBlocks(); i++) {
blocks.free(m_pointers[i]);
}
}
}
public void benchReadWrite(IBlockAllocator blocks) {
int iterations = 10000;
@SuppressWarnings("unused")
long sum = 0;
for (int k = 0; k < iterations; k++) {
for (int i = 0; i < blocks.maxBlocks(); i++) {
int p = blocks.malloc();
for (int j = 0; j < blocks.blockSize(); j++) {
blocks.setInt(p, j, i);
sum += blocks.getInt(p, j);
}
}
blocks.clear();
}
}
}