package perf;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import com.fasterxml.jackson.core.*;
/**
* Manual performance test to try out various synchronization
* methods for symbol tables.
*/
public class ConcurrencyReadTest
{
private final static int THREADS = 50;
private void test() throws Exception
{
final JsonFactory jf = new JsonFactory();
final byte[] INPUT = "{\"a\":1}".getBytes("UTF-8");
final AtomicInteger count = new AtomicInteger();
for (int i = 0; i < THREADS; ++i) {
new Thread(new Runnable() {
@Override
public void run()
{
try {
while (true) {
parse(jf, INPUT);
count.addAndGet(1);
}
} catch (IOException e) {
System.err.println("PROBLEM: "+e);
}
}
}).start();
}
// wait slightly....
Thread.sleep(200L);
double totalTime = 0.0;
double totalCount = 0.0;
while (true) {
long start = System.currentTimeMillis();
int startCount = count.get();
Thread.sleep(1000L);
int done = count.get() - startCount;
long time = System.currentTimeMillis() - start;
totalTime += time;
totalCount += done;
double rate = (double) done / (double) time;
System.out.printf("Rate: %.1f (avg: %.1f)\n", rate, totalCount/totalTime);
}
}
protected void parse(JsonFactory jf, byte[] input) throws IOException
{
JsonParser jp = jf.createParser(input, 0, input.length);
while (jp.nextToken() != null) {
;
}
jp.close();
}
public static void main(String[] args) throws Exception
{
if (args.length != 0) {
System.err.println("Usage: java ...");
System.exit(1);
}
new ConcurrencyReadTest().test();
}
}