Adding benchmark for PathMappings
This commit is contained in:
parent
b2e675ebad
commit
43459d4b33
|
@ -0,0 +1,222 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
//
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
//
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
//
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
package org.eclipse.jetty.websocket.jsr356.server.pathmap;
|
||||
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.eclipse.jetty.http.PathMap;
|
||||
import org.eclipse.jetty.toolchain.test.AdvancedRunner;
|
||||
import org.eclipse.jetty.toolchain.test.annotation.Stress;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@RunWith(AdvancedRunner.class)
|
||||
public class PathMappingsBenchmarkTest
|
||||
{
|
||||
public static abstract class AbstractPathMapThread extends Thread
|
||||
{
|
||||
private int iterations;
|
||||
private CyclicBarrier barrier;
|
||||
private long success;
|
||||
private long error;
|
||||
|
||||
public AbstractPathMapThread(int iterations, CyclicBarrier barrier)
|
||||
{
|
||||
this.iterations = iterations;
|
||||
this.barrier = barrier;
|
||||
}
|
||||
|
||||
public abstract String getMatchedResource(String path);
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
int llen = LOOKUPS.length;
|
||||
String path;
|
||||
String expectedResource;
|
||||
String matchedResource;
|
||||
await(barrier);
|
||||
for (int iter = 0; iter < iterations; iter++)
|
||||
{
|
||||
for (int li = 0; li < llen; li++)
|
||||
{
|
||||
path = LOOKUPS[li][0];
|
||||
expectedResource = LOOKUPS[li][1];
|
||||
matchedResource = getMatchedResource(path);
|
||||
if (matchedResource.equals(expectedResource))
|
||||
{
|
||||
success++;
|
||||
}
|
||||
else
|
||||
{
|
||||
error++;
|
||||
}
|
||||
}
|
||||
}
|
||||
await(barrier);
|
||||
}
|
||||
}
|
||||
|
||||
public static class PathMapMatchThread extends AbstractPathMapThread
|
||||
{
|
||||
private PathMap<String> pathmap;
|
||||
|
||||
public PathMapMatchThread(PathMap<String> pathmap, int iters, CyclicBarrier barrier)
|
||||
{
|
||||
super(iters,barrier);
|
||||
this.pathmap = pathmap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMatchedResource(String path)
|
||||
{
|
||||
return pathmap.getMatch(path).getValue();
|
||||
}
|
||||
}
|
||||
|
||||
public static class PathMatchThread extends AbstractPathMapThread
|
||||
{
|
||||
private PathMappings<String> pathmap;
|
||||
|
||||
public PathMatchThread(PathMappings<String> pathmap, int iters, CyclicBarrier barrier)
|
||||
{
|
||||
super(iters,barrier);
|
||||
this.pathmap = pathmap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMatchedResource(String path)
|
||||
{
|
||||
return pathmap.getMatch(path).getResource();
|
||||
}
|
||||
}
|
||||
|
||||
private static final Logger LOG = Log.getLogger(PathMappingsBenchmarkTest.class);
|
||||
private static final String[][] LOOKUPS;
|
||||
private int runs = 10;
|
||||
private int threads = 100;
|
||||
private int iters = 1000;
|
||||
|
||||
static
|
||||
{
|
||||
LOOKUPS = new String[][]
|
||||
{
|
||||
// @formatter:off
|
||||
{ "/abs/path", "path" },
|
||||
{ "/abs/path/longer","longpath" },
|
||||
{ "/abs/path/foo","default" },
|
||||
{ "/main.css","default" },
|
||||
{ "/downloads/script.gz","gzipped" },
|
||||
{ "/downloads/distribution.tar.gz","tarball" },
|
||||
{ "/downloads/readme.txt","default" },
|
||||
{ "/downloads/logs.tgz","default" },
|
||||
{ "/animal/horse/mustang","animals" },
|
||||
{ "/animal/bird/eagle/bald","birds" },
|
||||
{ "/animal/fish/shark/hammerhead","fishes" },
|
||||
{ "/animal/insect/ladybug","animals" },
|
||||
// @formatter:on
|
||||
};
|
||||
}
|
||||
|
||||
private static void await(CyclicBarrier barrier)
|
||||
{
|
||||
try
|
||||
{
|
||||
barrier.await();
|
||||
}
|
||||
catch (Exception x)
|
||||
{
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
}
|
||||
|
||||
@Stress("High CPU")
|
||||
@Test
|
||||
public void testServletPathMap()
|
||||
{
|
||||
// Setup (old) PathMap
|
||||
|
||||
PathMap<String> p = new PathMap<>();
|
||||
|
||||
p.put("/abs/path","path");
|
||||
p.put("/abs/path/longer","longpath");
|
||||
p.put("/animal/bird/*","birds");
|
||||
p.put("/animal/fish/*","fishes");
|
||||
p.put("/animal/*","animals");
|
||||
p.put("*.tar.gz","tarball");
|
||||
p.put("*.gz","gzipped");
|
||||
p.put("/","default");
|
||||
|
||||
final CyclicBarrier barrier = new CyclicBarrier(threads + 1);
|
||||
|
||||
for (int r = 0; r < runs; r++)
|
||||
{
|
||||
for (int t = 0; t < threads; t++)
|
||||
{
|
||||
PathMapMatchThread thread = new PathMapMatchThread(p,iters,barrier);
|
||||
thread.start();
|
||||
}
|
||||
await(barrier);
|
||||
long begin = System.nanoTime();
|
||||
await(barrier);
|
||||
long end = System.nanoTime();
|
||||
long elapsed = TimeUnit.NANOSECONDS.toMillis(end - begin);
|
||||
int totalMatches = threads * iters * LOOKUPS.length;
|
||||
LOG.info("PathMap (Servlet only) threads:{}/iters:{}/total-matches:{} => {} ms",threads,iters,totalMatches,elapsed);
|
||||
}
|
||||
}
|
||||
|
||||
@Stress("High CPU")
|
||||
@Test
|
||||
public void testServletPathMappings()
|
||||
{
|
||||
// Setup (new) PathMappings
|
||||
|
||||
PathMappings<String> p = new PathMappings<>();
|
||||
|
||||
p.put(new ServletPathSpec("/abs/path"),"path");
|
||||
p.put(new ServletPathSpec("/abs/path/longer"),"longpath");
|
||||
p.put(new ServletPathSpec("/animal/bird/*"),"birds");
|
||||
p.put(new ServletPathSpec("/animal/fish/*"),"fishes");
|
||||
p.put(new ServletPathSpec("/animal/*"),"animals");
|
||||
p.put(new ServletPathSpec("*.tar.gz"),"tarball");
|
||||
p.put(new ServletPathSpec("*.gz"),"gzipped");
|
||||
p.put(new ServletPathSpec("/"),"default");
|
||||
|
||||
final CyclicBarrier barrier = new CyclicBarrier(threads + 1);
|
||||
|
||||
for (int r = 0; r < runs; r++)
|
||||
{
|
||||
for (int t = 0; t < threads; t++)
|
||||
{
|
||||
PathMatchThread thread = new PathMatchThread(p,iters,barrier);
|
||||
thread.start();
|
||||
}
|
||||
await(barrier);
|
||||
long begin = System.nanoTime();
|
||||
await(barrier);
|
||||
long end = System.nanoTime();
|
||||
long elapsed = TimeUnit.NANOSECONDS.toMillis(end - begin);
|
||||
LOG.info("PathMappings (Servlet only) threads:{}/iters:{} => {} ms",threads,iters,elapsed);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue