/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.util.http.parser; import java.util.BitSet; import org.junit.Test; public class TesterParserPerformance { @Test public void testBitSetVsBooleanArray() { Lookup bitsetLookup = new BitSetLookup(); Lookup booleanArrayLookup = new BooleanArrayLookup(); int count = 10000; int loops = 5; // Warm up doLookupTest(bitsetLookup, count); doLookupTest(booleanArrayLookup, count); for (int i = 0; i < loops; i++) { System.out.println("Bitset : " + doLookupTest(bitsetLookup, count) + "ns"); System.out.println("Boolean[]: " + doLookupTest(booleanArrayLookup, count) + "ns"); } } private long doLookupTest(Lookup lookup, int iterations) { long start = System.nanoTime(); for (int i = 0; i < iterations; i++) { for (int j = 0; j < 128; j++) { lookup.doLookup(j); } } return System.nanoTime() - start; } @Test public void testExceptionVsBoundsCheck() { Lookup boundsCheck = new BooleanArrayLookupBoundsCheck(); Lookup exceptionCheck = new BooleanArrayLookupExceptionCheck(); int count = 10000; int loops = 5; // Warm up doLookupTestCheck(boundsCheck, count, 0, 127); doLookupTestCheck(exceptionCheck, count, 0, 127); doLookupTestCheck(boundsCheck, count, 128, 255); doLookupTestCheck(exceptionCheck, count, 128, 255); for (int i = 0; i < loops; i++) { System.out.println("Bounds:Valid : " + doLookupTestCheck(boundsCheck, count, 0, 127) + "ns"); System.out.println("ExceptionValid : " + doLookupTestCheck(exceptionCheck, count, 0, 127) + "ns"); System.out.println("Bounds:Invalid : " + doLookupTestCheck(boundsCheck, count, 128, 255) + "ns"); System.out.println("ExceptionInvalid : " + doLookupTestCheck(exceptionCheck, count, 128, 255) + "ns"); } } private long doLookupTestCheck(Lookup lookup, int iterations, int testStart, int testEnd) { long start = System.nanoTime(); for (int i = 0; i < iterations; i++) { for (int j = testStart; j < testEnd; j++) { lookup.doLookup(j); } } return System.nanoTime() - start; } private interface Lookup { boolean doLookup(int i); } private static class BitSetLookup implements Lookup { private BitSet values = new BitSet(128); @Override public boolean doLookup(int i) { return values.get(i); } } private static class BooleanArrayLookup implements Lookup { private boolean[] values = new boolean[128]; @Override public boolean doLookup(int i) { return values[i]; } } private static class BooleanArrayLookupBoundsCheck implements Lookup { private boolean[] values = new boolean[128]; @Override public boolean doLookup(int i) { if (i < 0 || i > 127) { return false; } return values[i]; } } private static class BooleanArrayLookupExceptionCheck implements Lookup { private boolean[] values = new boolean[128]; @Override public boolean doLookup(int i) { try { return values[i]; } catch (ArrayIndexOutOfBoundsException aioe) { return false; } } } }