/* * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.sail.nativerdf.datastore; import info.aduna.io.FileUtil; import java.io.File; import java.util.ArrayList; import java.util.List; /** * */ public class DataStorePerfTest { public static void main(String[] args) throws Exception { System.out.println("DataStore performance test"); System.out.println("=========================="); System.out.println("Warming up..."); for (int i = 0; i < 3; i++) { runPerformanceTest(10000); System.gc(); Thread.sleep(2000); } System.out.println("Starting test..."); List<long[]> timeDataList = new ArrayList<long[]>(); for (int stringCount = 1000000; stringCount <= 3000000; stringCount += 1000000) { timeDataList.add( runPerformanceTest(stringCount)); System.gc(); Thread.sleep(1000); } System.out.println("Performance test results, average times in micro seconds"); System.out.println("#str\tstore\tgetID\tgetData"); for (long[] timeData : timeDataList) { System.out.printf("%d\t%d\t%d\t%d", timeData[0], timeData[1]/1000, timeData[2]/1000, timeData[3]/1000); System.out.println(); } } private static long[] runPerformanceTest(int stringCount) throws Exception { System.out.println("Running performance test with " + stringCount + " strings..."); long[] timeData = new long[4]; timeData[0] = stringCount; File dataDir = FileUtil.createTempDir("datastoretest"); try { System.out.println("Initializing data store in directory " + dataDir); DataStore dataStore = new DataStore(dataDir, "strings"); System.out.println("Storing strings..."); long startTime = System.nanoTime(); for (int i = 1; i <= stringCount; i++) { dataStore.storeData(String.valueOf(i).getBytes()); } dataStore.sync(); long endTime = System.nanoTime(); timeData[1] = (endTime - startTime) / stringCount; System.out.println("Strings stored in " + (endTime-startTime)/1E6 + " ms"); System.out.println("Fetching IDs for all strings..."); startTime = System.nanoTime(); for (int i = 1; i <= stringCount; i++) { int sID = dataStore.getID(String.valueOf(i).getBytes()); if (sID == -1) { throw new RuntimeException("Failed to get ID for string \"" + i + "\""); } } endTime = System.nanoTime(); timeData[2] = (endTime - startTime) / stringCount; System.out.println("All IDs fetched in " + (endTime-startTime)/1E6 + " ms"); System.out.println("Fetching data for all IDs..."); startTime = System.nanoTime(); for (int id = 1; id <= stringCount; id++) { String s = new String(dataStore.getData(id)); if (s == null) { throw new RuntimeException("Failed to get data for ID " + id); } } endTime = System.nanoTime(); timeData[3] = (endTime - startTime) / stringCount; System.out.println("All data fetched in " + (endTime-startTime)/1E6 + " ms"); System.out.println("Closing DataStore..."); dataStore.close(); System.out.println("Done."); return timeData; } finally { FileUtil.deleteDir(dataDir); } } }