blob: 176724e4818e4c1696b66b236fad1413c4cd4124 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Cloudsmith Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Cloudsmith Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.tests.omniVersion;
import junit.framework.TestCase;
import org.eclipse.equinox.p2.metadata.Version;
/**
* Simple performance comparison between OSGi version implementation and Omni Version.
* Tests performance of creating version instances using 4 values, as well as string parsing.
* Tests comparison of versions.
*
* Aprox 10000 instances are created.
* Comparison compares all instances against all other (i.e. about 10 milj).
*
*/
public class PerformanceTest extends TestCase {
static final int MUL = 24;
static final String qualifierTemplate = "r20090112-12345-abcdefghijklmnopqrstuvwxyz"; // longer than MUL chars
public void testStringCreationPerformance() {
// Ensure that classes are loaded etc.
Version.MAX_VERSION.compareTo(Version.emptyVersion);
org.osgi.framework.Version.emptyVersion.compareTo(org.osgi.framework.Version.emptyVersion);
// Create all versions in string format
String[] strings = createStrings();
long start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
osgiVersionCreateFromString(strings);
long osgiTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
omniVersionCreateFromString(strings);
long omniTime = System.currentTimeMillis() - start;
outputResult("String creation", 100 * MUL * MUL * MUL, osgiTime, omniTime);
// System.out.printf("String creation: osgi=%d, omni=%d, factor=%.2f\n", osgiTime, omniTime, factor(omniTime, osgiTime));
}
public void testCreationPerformance() {
// Ensure that classes are loaded etc.
Version.MAX_VERSION.compareTo(Version.emptyVersion);
org.osgi.framework.Version.emptyVersion.compareTo(org.osgi.framework.Version.emptyVersion);
long start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
osgiVersionCreate();
long osgiTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
omniVersionCreate();
long omniTime = System.currentTimeMillis() - start;
outputResult("Creation", 100 * MUL * MUL * MUL, osgiTime, omniTime);
// System.out.printf("Creation: osgi=%d, omni=%d, factor=%f2\n", osgiTime, omniTime, factor(omniTime, osgiTime));
}
public void testComparePerformance() {
Version[] omniVersions = createOmniVersions();
org.osgi.framework.Version osgiVersions[] = createOsgiVersions();
long start = System.currentTimeMillis();
osgiVersionCompare(osgiVersions);
long osgiTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
omniVersionCompare(omniVersions);
long omniTime = System.currentTimeMillis() - start;
long units = MUL * MUL * MUL * MUL * MUL * MUL;
outputResult("Compare", units, osgiTime, omniTime);
//System.out.printf("Compare (%d comparisons): osgi=%d, omni=%d\n, factor=%d", units, osgiTime, omniTime, omniTime / osgiTime);
}
public void testEqualsPerformance() {
Version[] omniVersions = createOmniVersions();
org.osgi.framework.Version osgiVersions[] = createOsgiVersions();
long start = System.currentTimeMillis();
osgiVersionEquals(osgiVersions);
long osgiTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
omniVersionEquals(omniVersions);
long omniTime = System.currentTimeMillis() - start;
long units = MUL * MUL * MUL * MUL * MUL * MUL;
outputResult("Equals", units, osgiTime, omniTime);
//System.out.printf("Equals (%d comparisons): osgi=%d, omni=%d, factor=%d\n", units, osgiTime, omniTime, omniTime / osgiTime);
}
public void testToStringPerformance() {
Version[] omniVersions = createOmniVersions();
org.osgi.framework.Version osgiVersions[] = createOsgiVersions();
long start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
osgiVersionToString(osgiVersions);
long osgiTime = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
for (int idx = 0; idx < 100; ++idx)
omniVersionToString(omniVersions);
long omniTime = System.currentTimeMillis() - start;
long units = 100 * MUL * MUL * MUL;
outputResult("To String", units, osgiTime, omniTime);
//System.out.printf("toString (%d versions): osgi=%d, omni=%d\n", units, osgiTime, omniTime);
}
public static void osgiVersionToString(org.osgi.framework.Version versions[]) {
// compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
versions[i].toString();
}
public static void omniVersionToString(Version versions[]) {
// compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
versions[i].toString();
}
public static void omniVersionCreate() {
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
Version.createOSGi(i, j, k, qualifierTemplate);
}
public static void omniVersionCompare(Version versions[]) {
//compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
for (int j = 0; j < MUL * MUL * MUL; j++)
versions[i].compareTo(versions[j]);
}
public static void omniVersionEquals(Version versions[]) {
//compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
for (int j = 0; j < MUL * MUL * MUL; j++)
versions[i].equals(versions[j]);
}
public static void omniVersionCreateFromString(String[] strings) {
int x = 0;
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
Version.create(strings[x++]);
}
public static void osgiVersionCompare(org.osgi.framework.Version versions[]) {
// compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
for (int j = 0; j < MUL * MUL * MUL; j++)
versions[i].compareTo(versions[j]);
}
public static void osgiVersionEquals(org.osgi.framework.Version versions[]) {
// compare every version against all other versions
for (int i = 0; i < MUL * MUL * MUL; i++)
for (int j = 0; j < MUL * MUL * MUL; j++)
versions[i].equals(versions[j]);
}
public static void osgiVersionCreate() {
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
new org.osgi.framework.Version(i, j, k, qualifierTemplate);
}
public static void osgiVersionCreateFromString(String[] strings) {
int x = 0;
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
org.osgi.framework.Version.parseVersion(strings[x++]);
}
/**
* Create a set of different versions. The execution of this method does not take part
* in the time measurement
*/
private static Version[] createOmniVersions() {
Version versions[] = new Version[MUL * MUL * MUL];
int x = 0;
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
versions[x++] = Version.createOSGi(i, j, k, qualifierTemplate.substring(0, k + 1));
return versions;
}
/**
* Create a set of different versions. The execution of this method does not take part
* in the time measurement
*/
private static org.osgi.framework.Version[] createOsgiVersions() {
org.osgi.framework.Version versions[] = new org.osgi.framework.Version[MUL * MUL * MUL];
int x = 0;
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++)
versions[x++] = new org.osgi.framework.Version(i, j, k, qualifierTemplate.substring(0, k + 1));
return versions;
}
/**
* Create a set of different version strings. The execution of this method does not take part
* in the time measurement
*/
private static String[] createStrings() {
String[] strings = new String[MUL * MUL * MUL];
StringBuffer buf = new StringBuffer(100);
int x = 0;
for (int i = 0; i < MUL; i++)
for (int j = 0; j < MUL; j++)
for (int k = 0; k < MUL; k++) {
buf.setLength(0);
buf.append(i);
buf.append(".");
buf.append(j);
buf.append(".");
buf.append(k);
buf.append(".");
buf.append(qualifierTemplate.substring(0, k + 1));
strings[x++] = buf.toString();
}
return strings;
}
private static double factor(long osgiTime, long omniTime) {
double osgi = osgiTime;
double omni = omniTime;
return osgi / omni;
}
private static void outputResult(String message, long units, long osgiTime, long omniTime) {
System.out.printf("%s (units %d): osgi=%d [%.2fus/unit], omni=%d [%.2fus/unit], factor=%.2f\n", message, units, osgiTime, perUnit(osgiTime, units), omniTime, perUnit(omniTime, units), factor(omniTime, osgiTime));
}
private static double perUnit(long timeMillisec, long units) {
double time = (timeMillisec * 1000);
double u = units;
return time / u;
}
}