blob: 4830ade51624038bd0b6dfa5fd5c1e583f012aea [file] [log] [blame]
/*
* Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
/*
* ProfilerImpl.java
*
* Created on September 17, 2001, 12:42 PM
*/
package com.sun.enterprise.util;
import java.util.*;
/** Simple class for profiling code. beginItem/endItem pairs start and stop the timing for an item.
*
* @author bnevins
*/
public class ProfilerImpl {
/** Create an empty object
*/
public ProfilerImpl() {
}
/**Reset all the timing information
*/
public void reset() {
currItem = null;
items.clear();
numBegins = 0;
numEnds = 0;
numActualEnds = 0;
}
/** Start timing an item.
**/
public void beginItem() {
beginItem("No Description");
}
/** Start timing an item.
* @param desc - Descriptive text for the item
**/
public void beginItem(String desc) {
//if(currItem != null)
//Reporter.assert(currItem.hasEnded());
currItem = new Item(desc);
items.add(currItem);
++numBegins;
}
/** Stop timing an item and store the information.
**/
public void endItem() {
++numEnds;
Item item = getLastNotEnded();
if (item != null) {
item.end();
}
++numActualEnds;
}
/** Return a formatted String with the timing information
**/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\nBegins: ").append(numBegins).append(", Ends: ").append(numEnds)
.append(", Actual Ends: ").append(numActualEnds).append("\n");
sb.append(Item.getHeader());
sb.append("\n");
for (Iterator iter = items.iterator(); iter.hasNext();) {
Item item = (Item) iter.next();
sb.append(item.toString());
sb.append("\n");
}
return sb.toString();
}
////////////////////////////////////////////////////////////////////////////
private Item getLastNotEnded() {
int index = items.size();
while (--index >= 0) {
Item item = (Item) items.get(index);
if (!item.hasEnded()) {
return item;
}
}
return null;
}
////////////////////////////////////////////////////////////////////////////
private static class Item {
Item(String desc) {
title = desc;
startTime = System.currentTimeMillis();
endTime = startTime;
setLongestTitle(title.length());
}
boolean hasEnded() {
return ended;
//return endTime > startTime;
}
void end() {
endTime = System.currentTimeMillis();
ended = true;
}
@Override
public String toString() {
long finish = hasEnded() ? endTime : System.currentTimeMillis();
String totalTime = "" + (finish - startTime);
if (totalTime.equals("0")) {
totalTime = "< 1";
}
String desc = StringUtils.padRight(title, longestTitle + 1);
String time = StringUtils.padLeft(totalTime, 8);
if (!hasEnded()) {
time += " ** STILL RUNNING **";
}
return desc + time;
}
public static String getHeader() {
return "\n" + StringUtils.padRight("Description", longestTitle + 1) + StringUtils.padLeft("msec", 8);
}
private static void setLongestTitle(int len) {
synchronized (lock) {
if (len > longestTitle) {
longestTitle = len;
}
}
}
String title;
long startTime;
long endTime;
static int longestTitle = 12;
private final static Object lock = new Object();
boolean ended = false;
}
////////////////////////////////////////////////////////////////////////////
Item currItem = null;
List<Item> items = new ArrayList<Item>();
int numBegins = 0;
int numEnds = 0;
int numActualEnds = 0;
////////////////////////////////////////////////////////////////////////////
/** Simple unit test
**/
public static void main(String[] notUsed) {
ProfilerImpl p = new ProfilerImpl();
try {
p.beginItem("first item");
Thread.sleep(3000);
p.beginItem("second item here dude whoa yowser yowser");
Thread.sleep(1500);
p.endItem();
p.endItem();
System.out.println("" + p);
} catch (Exception e) {
}
}
}