| /******************************************************************************* |
| * Copyright (c) 2000, 2006 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.ui.internal.misc; |
| |
| import java.util.HashMap; |
| |
| import org.eclipse.core.runtime.PerformanceStats; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * This class is used for monitoring performance events. Each performance |
| * event has an associated option in the org.eclipse.ui plugin's .options file |
| * that specifies an maximum acceptable duration for that event. |
| * |
| * @see org.eclipse.core.runtime.PerformanceStats |
| */ |
| public class UIStats { |
| |
| private static HashMap operations = new HashMap(); |
| |
| public static final int CREATE_PART = 0; |
| |
| public static final int CREATE_PART_CONTROL = 1; |
| |
| public static final int INIT_PART = 2; |
| |
| public static final int CREATE_PERSPECTIVE = 3; |
| |
| public static final int RESTORE_WORKBENCH = 4; |
| |
| public static final int START_WORKBENCH = 5; |
| |
| public static final int CREATE_PART_INPUT = 6; |
| |
| public static final int ACTIVATE_PART = 7; |
| |
| public static final int BRING_PART_TO_TOP = 8; |
| |
| public static final int NOTIFY_PART_LISTENERS = 9; |
| |
| public static final int SWITCH_PERSPECTIVE = 10; |
| |
| public static final int NOTIFY_PAGE_LISTENERS = 11; |
| |
| public static final int NOTIFY_PERSPECTIVE_LISTENERS = 12; |
| |
| public static final int UI_JOB = 13; |
| |
| public static final int CONTENT_TYPE_LOOKUP = 14; |
| |
| /** |
| * Change this value when you add a new event constant. |
| */ |
| public static final int LAST_VALUE = CONTENT_TYPE_LOOKUP; |
| |
| private static boolean debug[] = new boolean[LAST_VALUE+1]; |
| |
| private static String[] events = new String[LAST_VALUE+1]; |
| |
| static { |
| events[CREATE_PART] = PlatformUI.PLUGIN_ID + "/perf/part.create"; //$NON-NLS-1$ |
| events[CREATE_PART_INPUT] = PlatformUI.PLUGIN_ID + "/perf/part.input"; //$NON-NLS-1$ |
| events[CREATE_PART_CONTROL] = PlatformUI.PLUGIN_ID + "/perf/part.control"; //$NON-NLS-1$ |
| events[INIT_PART] = PlatformUI.PLUGIN_ID + "/perf/part.init"; //$NON-NLS-1$ |
| events[CREATE_PERSPECTIVE] = PlatformUI.PLUGIN_ID + "/perf/perspective.create"; //$NON-NLS-1$ |
| events[SWITCH_PERSPECTIVE] = PlatformUI.PLUGIN_ID + "/perf/perspective.switch"; //$NON-NLS-1$ |
| events[RESTORE_WORKBENCH] = PlatformUI.PLUGIN_ID + "/perf/workbench.restore"; //$NON-NLS-1$ |
| events[START_WORKBENCH] = PlatformUI.PLUGIN_ID + "/perf/workbench.start"; //$NON-NLS-1$ |
| events[ACTIVATE_PART] = PlatformUI.PLUGIN_ID + "/perf/part.activate"; //$NON-NLS-1$ |
| events[BRING_PART_TO_TOP] = PlatformUI.PLUGIN_ID + "/perf/part.activate"; //$NON-NLS-1$ |
| events[NOTIFY_PART_LISTENERS] = PlatformUI.PLUGIN_ID + "/perf/part.listeners"; //$NON-NLS-1$ |
| events[NOTIFY_PAGE_LISTENERS] = PlatformUI.PLUGIN_ID + "/perf/page.listeners"; //$NON-NLS-1$ |
| events[NOTIFY_PERSPECTIVE_LISTENERS] = PlatformUI.PLUGIN_ID + "/perf/perspective.listeners"; //$NON-NLS-1$ |
| events[UI_JOB] = PlatformUI.PLUGIN_ID + "/perf/uijob"; //$NON-NLS-1$ |
| events[CONTENT_TYPE_LOOKUP] = PlatformUI.PLUGIN_ID + "/perf/contentTypes"; //$NON-NLS-1$ |
| |
| for (int i = 0; i <= LAST_VALUE; i++) { |
| //don't log any performance events if the general performance stats is disabled |
| if (events[i] != null && PerformanceStats.ENABLED) { |
| debug[i] = PerformanceStats.isEnabled(events[i]); |
| } |
| } |
| } |
| |
| /** |
| * Returns whether tracing of the given debug event is turned on. |
| * |
| * @param event The event id |
| * @return <code>true</code> if tracing of this event is turned on, |
| * and <code>false</code> otherwise. |
| */ |
| public static boolean isDebugging(int event) { |
| return debug[event]; |
| } |
| |
| /** |
| * Indicates the start of a performance event |
| * |
| * @param event The event id |
| * @param label The event label |
| */ |
| public static void start(int event, String label) { |
| if (debug[event]) { |
| operations.put(event + label, new Long(System.currentTimeMillis())); |
| } |
| } |
| |
| /** |
| * Indicates the end of a performance operation |
| * |
| * @param event The event id |
| * @param blame An object that is responsible for the event that occurred, |
| * or that uniquely describes the event that occurred |
| * @param label The event label |
| */ |
| public static void end(int event, Object blame, String label) { |
| if (debug[event]) { |
| Long startTime = (Long) operations.remove(event + label); |
| if (startTime == null) { |
| return; |
| } |
| final long elapsed = System.currentTimeMillis() - startTime.longValue(); |
| // System.out.println("Time - " + //$NON-NLS-1$ |
| // elapsed + events[event] + label); |
| PerformanceStats.getStats(events[event], blame).addRun(elapsed, label); |
| } |
| } |
| |
| /** |
| * Special hook to signal that application startup is complete and the event |
| * loop has started running. |
| */ |
| public static void startupComplete() { |
| // We use a runtime debug option here for backwards compatibility (bug 96672) |
| // Note that this value is only relevant if the workspace chooser is not used. |
| String option = Platform.getDebugOption(Platform.PI_RUNTIME + "/debug"); //$NON-NLS-1$ |
| if (option == null || !"true".equalsIgnoreCase(option)) { //$NON-NLS-1$ |
| return; |
| } |
| String startString = System.getProperty("eclipse.startTime"); //$NON-NLS-1$ |
| if (startString == null) { |
| return; |
| } |
| try { |
| long start = Long.parseLong(startString); |
| long end = System.currentTimeMillis(); |
| System.out.println("Startup complete: " + (end - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } catch (NumberFormatException e) { |
| //this is just debugging code -- ok to swallow exception |
| } |
| } |
| } |