blob: 73acf5f98e0c10ee14d76c695edb9256663168e9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.performance;
import java.io.PrintStream;
import java.text.NumberFormat;
import junit.framework.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.search.*;
import org.eclipse.jdt.internal.core.search.processing.IJob;
/**
*/
public class FullSourceWorkspaceSearchTests extends FullSourceWorkspaceTests implements IJavaSearchConstants {
// Tests counters
private static int TESTS_COUNT = 0;
private final static int ITERATIONS_COUNT = 10;
// Search stats
private static int[] REFERENCES = new int[4];
private static int ALL_TYPES_NAMES = 0;
// Log file streams
private static PrintStream[] LOG_STREAMS = new PrintStream[LOG_TYPES.length];
// Scopes
IJavaSearchScope workspaceScope;
/**
* @param name
*/
public FullSourceWorkspaceSearchTests(String name) {
super(name);
}
static {
// org.eclipse.jdt.internal.core.search.processing.JobManager.VERBOSE = true;
// TESTS_NAMES = new String[] { "testPerfIndexing", "testPerfSearchAllTypeNames" };
}
/*
* Specific way to build test suite.
* We need to know whether test perf indexing is in list to allow
* index manager disabling.
* CAUTION: If test perf indexing is not included in test suite,
* then time for other tests may include time spent to index files!
*/
public static Test suite() {
Test suite = buildSuite(testClass());
TESTS_COUNT = suite.countTestCases();
createPrintStream(testClass().getName(), LOG_STREAMS, TESTS_COUNT, null);
return suite;
}
private static Class testClass() {
return FullSourceWorkspaceSearchTests.class;
}
protected void setUp() throws Exception {
super.setUp();
this.resultCollector = new JavaSearchResultCollector();
this.workspaceScope = SearchEngine.createWorkspaceScope();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
// End of execution => one test less
TESTS_COUNT--;
// Log perf result
if (LOG_DIR != null) {
logPerfResult(LOG_STREAMS, TESTS_COUNT);
}
// Print statistics
if (TESTS_COUNT == 0) {
System.out.println("-------------------------------------");
System.out.println("Search performance test statistics:");
NumberFormat intFormat = NumberFormat.getIntegerInstance();
System.out.println(" - "+intFormat.format(REFERENCES[0])+" type references found.");
System.out.println(" - "+intFormat.format(REFERENCES[1])+" field references found.");
System.out.println(" - "+intFormat.format(REFERENCES[2])+" method references found.");
System.out.println(" - "+intFormat.format(REFERENCES[3])+" constructor references found.");
System.out.println(" - "+intFormat.format(ALL_TYPES_NAMES)+" all types names.");
System.out.println("-------------------------------------\n");
}
super.tearDown();
}
/**
* Simple search result collector: only count matches.
*/
class JavaSearchResultCollector extends SearchRequestor {
int count = 0;
public void acceptSearchMatch(SearchMatch match) throws CoreException {
this.count++;
}
}
/**
* Simple type name requestor: only count classes and interfaces.
* @deprecated
*/
class SearchTypeNameRequestor implements ITypeNameRequestor {
int count = 0;
public void acceptClass(char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path){
this.count++;
}
public void acceptInterface(char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path){
this.count++;
}
}
/**
* Job to measure times in same thread than index manager.
*/
class Measuring implements IJob {
boolean start;
Measuring(boolean start) {
this.start = start;
}
public boolean belongsTo(String jobFamily) {
return true;
}
public void cancel() {
// nothing to cancel
}
public void ensureReadyToRun() {
// always ready to do nothing
}
/**
* Execute the current job, answer whether it was successful.
*/
public boolean execute(IProgressMonitor progress) {
if (start) {
startMeasuring();
} else {
stopMeasuring();
commitMeasurements();
assertPerformance();
}
return true;
}
}
protected JavaSearchResultCollector resultCollector;
protected void search(String patternString, int searchFor, int limitTo) throws CoreException {
int matchMode = patternString.indexOf('*') != -1 || patternString.indexOf('?') != -1
? SearchPattern.R_PATTERN_MATCH
: SearchPattern.R_EXACT_MATCH;
SearchPattern pattern = SearchPattern.createPattern(
patternString,
searchFor,
limitTo,
matchMode | SearchPattern.R_CASE_SENSITIVE);
new SearchEngine().search(
pattern,
new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
this.workspaceScope,
this.resultCollector,
null);
}
/**
* Clean last category table cache
* @param type Tells whether previous search was a type search or not
*/
protected void cleanCategoryTableCache(boolean type) throws CoreException {
long time = System.currentTimeMillis();
if (type) {
search("foo", FIELD, DECLARATIONS);
} else {
search("Foo", TYPE, DECLARATIONS);
}
if (DEBUG) System.out.println("Time to clean category table cache: "+(System.currentTimeMillis()-time));
}
/**
* Performance tests for search: Indexing.
*
* First wait that already started indexing jobs end before perform test.
* Consider this initial indexing jobs as warm-up for this test.
*/
public void testIndexing() throws CoreException {
tagAsSummary("Search>Indexing", true); // put in fingerprint
// Wait for indexing end (we use initial indexing as warm-up)
waitUntilIndexesReady();
// Remove all previous indexing
INDEX_MANAGER.removeIndexFamily(new Path(""));
INDEX_MANAGER.reset();
// Clean memory
runGc();
// Restart brand new indexing
INDEX_MANAGER.request(new Measuring(true/*start measuring*/));
for (int i=0, length=ALL_PROJECTS.length; i<length; i++) {
INDEX_MANAGER.indexAll(ALL_PROJECTS[i].getProject());
}
// Wait for indexing end
waitUntilIndexesReady();
// Commit
INDEX_MANAGER.request(new Measuring(false /*end measuring*/));
waitUntilIndexesReady();
}
/**
* Performance tests for search: Declarations Types Names.
*
* First wait that already started indexing jobs end before perform test.
* Perform one search before measure performance for warm-up.
*
* @deprecated As we use deprecated API
*/
public void testSearchAllTypeNames() throws CoreException {
tagAsSummary("Search>Names>Workspace", true); // put in fingerprint
SearchTypeNameRequestor requestor = new SearchTypeNameRequestor();
// Wait for indexing end
waitUntilIndexesReady();
// Warm up
new SearchEngine().searchAllTypeNames(
null,
null,
SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
IJavaSearchConstants.TYPE,
this.workspaceScope,
requestor,
WAIT_UNTIL_READY_TO_SEARCH,
null);
// Clean memory
runGc();
// Measures
for (int i=0; i<MEASURES_COUNT; i++) {
cleanCategoryTableCache(true);
startMeasuring();
for (int j=0; j<ITERATIONS_COUNT; j++) {
new SearchEngine().searchAllTypeNames(
null,
null,
SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE,
IJavaSearchConstants.TYPE,
this.workspaceScope,
requestor,
WAIT_UNTIL_READY_TO_SEARCH,
null);
}
stopMeasuring();
}
// Commit
commitMeasurements();
assertPerformance();
// Store counter
ALL_TYPES_NAMES = requestor.count;
}
/**
* Performance tests for search: Occurence Types.
*
* First wait that already started indexing jobs end before perform test.
* Perform one search before measure performance for warm-up.
*
* Note that following search have been tested:
* - "String": > 65000 macthes (CAUTION: needs -Xmx512M)
* - "Object": 13497 matches
* - ""IResource": 5886 macthes
* - "JavaCore": 2145 matches
*/
public void testSearchType() throws CoreException {
tagAsSummary("Search>Occurences>Types", true); // put in fingerprint
// Wait for indexing end
waitUntilIndexesReady();
// Warm up
search("JavaCore", TYPE, ALL_OCCURRENCES);
// Clean memory
runGc();
// Measures
for (int i=0; i<MEASURES_COUNT; i++) {
cleanCategoryTableCache(true);
startMeasuring();
search("JavaCore", TYPE, ALL_OCCURRENCES);
stopMeasuring();
}
// Commit
commitMeasurements();
assertPerformance();
// Store counter
REFERENCES[0] = this.resultCollector.count;
}
/**
* Performance tests for search: Declarations Types Names.
*
* First wait that already started indexing jobs end before perform test.
* Perform one search before measure performance for warm-up.
*/
public void testSearchField() throws CoreException {
tagAsSummary("Search>Occurences>Fields", true); // put in fingerprint
// Wait for indexing end
waitUntilIndexesReady();
// Warm up
search("FILE", FIELD, ALL_OCCURRENCES);
// Clean memory
runGc();
// Measures
for (int i=0; i<MEASURES_COUNT; i++) {
cleanCategoryTableCache(false);
startMeasuring();
search("FILE", FIELD, ALL_OCCURRENCES);
stopMeasuring();
}
// Commit
commitMeasurements();
assertPerformance();
// Store counter
REFERENCES[1] = this.resultCollector.count;
}
/**
* Performance tests for search: Declarations Types Names.
*
* First wait that already started indexing jobs end before perform test.
* Perform one search before measure performance for warm-up.
*/
public void testSearchMethod() throws CoreException {
tagAsSummary("Search>Occurences>Methods", true); // put in fingerprint
// Wait for indexing end
waitUntilIndexesReady();
// Warm up
search("equals", METHOD, ALL_OCCURRENCES);
// Clean memory
runGc();
// Measures
for (int i=0; i<MEASURES_COUNT; i++) {
cleanCategoryTableCache(false);
startMeasuring();
search("equals", METHOD, ALL_OCCURRENCES);
stopMeasuring();
}
// Commit
commitMeasurements();
assertPerformance();
// Store counter
REFERENCES[2] = this.resultCollector.count;
}
/**
* Performance tests for search: Declarations Types Names.
*
* First wait that already started indexing jobs end before perform test.
* Perform one search before measure performance for warm-up.
*/
public void testSearchConstructor() throws CoreException {
tagAsSummary("Search>Occurences>Constructors", true); // put in fingerprint
// Wait for indexing end
waitUntilIndexesReady();
// Warm up
search("String", CONSTRUCTOR, ALL_OCCURRENCES);
// Clean memory
runGc();
// Measures
for (int i=0; i<MEASURES_COUNT; i++) {
cleanCategoryTableCache(false);
startMeasuring();
search("String", CONSTRUCTOR, ALL_OCCURRENCES);
stopMeasuring();
}
// Commit
commitMeasurements();
assertPerformance();
// Store counter
REFERENCES[3] = this.resultCollector.count;
}
}