/*
* 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.jena.riot.system;
import org.junit.Assert ;
import org.junit.BeforeClass ;
import org.junit.Test ;
/**
* Test for performance of {@link PrefixMap} implementations
*
*/
public class TestAbbreviationPerformance {
@BeforeClass static public void beforeClass()
{
// Warm the JIT.
int N = 1000 ;
PrefixMapStd normal = new PrefixMapStd();
populate(normal, N);
FastAbbreviatingPrefixMap fast = new FastAbbreviatingPrefixMap();
populate(fast, N);
for (int i = 1; i <= N ; i++) {
String input = "http://example/ns" + i + "#x";
String expected = "ns" + i + ":x";
run(normal, input, expected, 1000);
run(fast, input, expected, 1000);
}
}
/**
* Compares the performance of looking up every namespace 1000 times
* @param normal PrefixMap
* @param fast FastAbbreviatingPrefixMap
* @param namespaces Number of namespaces
* @param fastShouldWin Whether the FastAbbreviatingPrefixMap should outperform the PrefixMap
*/
private void test_amalgamated_performance(PrefixMapStd normal, FastAbbreviatingPrefixMap fast, int namespaces, boolean fastShouldWin) {
long nPerf = 0, fPerf = 0;
for (int i = 1; i <= namespaces; i++) {
String input = "http://example/ns" + i + "#x";
String expected = "ns" + i + ":x";
nPerf += run(normal, input, expected, 1000);
fPerf += run(fast, input, expected, 1000);
}
//System.out.printf("PrefixMap performance: %,12dns\n", nPerf);
//System.out.printf("Fast Prefix Map performance: %,12dns\n", fPerf);
//System.out.println() ;
if (fastShouldWin) {
if (fPerf > nPerf)
Assert.fail("Expected FastAbbreviatingPrefixMap to outperform PrefixMap");
} else {
if (nPerf > fPerf)
Assert.fail("Expected PrefixMap to outperform FastAbbreviatingPrefixMap");
}
}
private static long run(PrefixMap pmap, String input, String expected, int runs) {
long start = System.nanoTime();
for (int i = 1; i <= runs; i++) {
String x = pmap.abbreviate(input);
Assert.assertEquals(expected, x);
}
return System.nanoTime() - start;
}
private static void populate(PrefixMap pmap, int count) {
for (int i = 1; i <= count; i++) {
pmap.add("ns" + i, "http://example/ns" + i + "#");
}
}
/**
* Expect {@link PrefixMapStd} to outperform {@link FastAbbreviatingPrefixMap} when there
* is a single namespace
*/
@Test
public void prefixMap_abbrev_performance_01() {
PrefixMapStd pmap = new PrefixMapStd();
populate(pmap, 1);
FastAbbreviatingPrefixMap fmap = new FastAbbreviatingPrefixMap();
populate(fmap, 1);
test_amalgamated_performance(pmap, fmap, 1, false);
}
/**
* Expect {@link FastAbbreviatingPrefixMap} to significantly outperform
* {@link PrefixMapStd} once there are a good number of namespaces
*/
@Test
public void prefixMap_abbrev_performance_03() {
PrefixMapStd pmap = new PrefixMapStd();
populate(pmap, 40);
FastAbbreviatingPrefixMap fmap = new FastAbbreviatingPrefixMap();
populate(fmap, 40);
test_amalgamated_performance(pmap, fmap, 40, true);
}
/**
* Expect {@link FastAbbreviatingPrefixMap} to significantly outperform
* {@link PrefixMapStd} once there are a good number of namespaces
*/
@Test
public void prefixMap_abbrev_performance_04() {
PrefixMapStd pmap = new PrefixMapStd();
populate(pmap, 100);
FastAbbreviatingPrefixMap fmap = new FastAbbreviatingPrefixMap();
populate(fmap, 100);
test_amalgamated_performance(pmap, fmap, 100, true);
}
}