//import org.styloot.hobo.*; //Run with: // $ java -cp build/classes:build/hobo.jar:/usr/local/lib/\* FullSystemBenchmark import java.util.*; import java.util.concurrent.TimeUnit; import org.styloot.hobo.*; import org.styloot.hobo.hoboindex.*; public class FullSystemBenchmark { public static final double COLOR_DIST=10; private static Random random = new Random(); private static CIELabColor randomColor() { return CIELabColor.CIELabFromRGB((int)Math.random()*255, (int)Math.random()*255, (int)Math.random()*255); } private static final int MAX_QUALITY=25; private static final int randomQuality() { return random.nextInt(MAX_QUALITY); } private static final int MAX_COST=25; private static final int randomCost() { return 1+random.nextInt(MAX_COST); } private static final String[] CATEGORIES = new String[] { "/dress", "/dress/short", "/dress/long", "/skirt", "/skirt/mini", "/skirt/hippie", "/footwear", "/footwear/boots", "/footwear/sandals" }; private static String randomCategory() { return CATEGORIES[random.nextInt(CATEGORIES.length)]; } private static final int NUM_RANDOM_FEATURES = 2500; private static String randomFeature() { return "feature-" + random.nextInt(NUM_RANDOM_FEATURES); } private static final int ODD_RANDOM_FEATURES = 2000; private static final double ODD_FEATURE_PROBABILITY = 0.5; private static final int NUM_ODD_FEATURES = 10; private static final int FEATURE_GROUPS = 3; private static final int FEATURE_GROUP_SIZE = 10; private static final int RANDOM_FEATURE_SET_MAX_SIZE=15; private static Vector<String> randomFeatureSet() { Vector<String> result = new Vector<String>(); for (int i=0;i<FEATURE_GROUPS;i++) { result.add("feature-"+i+"-"+random.nextInt(FEATURE_GROUP_SIZE)); } if (random.nextDouble() < ODD_FEATURE_PROBABILITY) { //Half the time there are odd features, half the time it's standard int numFeatures = random.nextInt(NUM_ODD_FEATURES); for (int i=0;i<numFeatures;i++) { result.add("odd-feature-" + random.nextInt(ODD_RANDOM_FEATURES)); } } return result; } private static Vector<String> randomFeatureQuery() { Vector<String> result = new Vector<String>(); if (random.nextDouble() > 0.5) { int numGroups = random.nextInt(FEATURE_GROUPS); for (int i=0;i<numGroups;i++) { result.add("feature-"+i+"-"+random.nextInt(FEATURE_GROUP_SIZE)); } } if (random.nextDouble() > 0.5) { result.add("odd-feature-" + random.nextInt(ODD_RANDOM_FEATURES)); } return result; } private static Vector<String> randomGroupedFeatureQuery() { Vector<String> result = new Vector<String>(); if (random.nextDouble() > 0.5) { int numGroups = random.nextInt(FEATURE_GROUPS); for (int i=0;i<numGroups;i++) { result.add("feature-"+i+"-"+random.nextInt(FEATURE_GROUP_SIZE)); } } return result; } private static Item[] getItems(int numItems) { Item[] result = new Item[numItems]; for (int i=0;i<numItems;i++) { result[i] = new Item("id-" + i, randomCategory(), randomFeatureSet(), randomQuality(), randomColor(), randomCost()); } return result; } private static Item runIterator(Iterator<Item> iterator) { Item item = null; for (int i=0;i<ITEMS_PER_PAGE;i++) { if (iterator.hasNext()) { item = iterator.next(); } } return item; } public static final int NUM_ITEMS = (int)1e6; public static final int NUM_RUNS_PER_TEST=10000; public static final int ITEMS_PER_PAGE=50; public static double findByCategoryBenchmark(HoboIndex index) { long beginTime = System.nanoTime(); for (int i=0;i<NUM_RUNS_PER_TEST;i++) { Iterator<Item> iterator = index.find(randomCategory(), null, null, -1, 0, Integer.MAX_VALUE); runIterator(iterator); } return ((double)(System.nanoTime() - beginTime)) / (NUM_RUNS_PER_TEST); } public static double findByFeaturesBenchmark(HoboIndex index) { long beginTime = System.nanoTime(); for (int i=0;i<NUM_RUNS_PER_TEST;i++) { Iterator<Item> iterator = index.find("", randomFeatureQuery(), null, -1, 0, Integer.MAX_VALUE); runIterator(iterator); } return ((double)(System.nanoTime() - beginTime)) / NUM_RUNS_PER_TEST; } public static double findByFeaturesGroupedBenchmark(HoboIndex index) { long beginTime = System.nanoTime(); for (int i=0;i<NUM_RUNS_PER_TEST;i++) { Iterator<Item> iterator = index.find("", randomGroupedFeatureQuery(), null, -1, 0, Integer.MAX_VALUE); runIterator(iterator); } return ((double)(System.nanoTime() - beginTime)) / NUM_RUNS_PER_TEST; } public static void main(String[] args) { HoboIndex index = new SimpleHoboIndex(getItems(NUM_ITEMS)); CIELabColor baseColor = randomColor(); System.out.println( "FindByCategory: " + findByCategoryBenchmark(index)/1000 + "us"); System.out.println( "FindByFeatures: " + findByFeaturesBenchmark(index)/1000 + "us"); System.out.println( "FindByFeaturesGrouped: " + findByFeaturesGroupedBenchmark(index)/1000 + "us"); } }