public class ActionUtils {
private ActionUtils() {
}
public static long computeActionCostMilliseconds(Action0 action) {
long startTime = System.currentTimeMillis();
action.call();
long endTime = System.currentTimeMillis();
return endTime - startTime;
}
public static <T> T computeFuctionCostMilliseconds(Func0<T> action, int elapsedMillisecondsLimit, Action1<Long>
loggerAction) {
return computeFuctionCostMilliseconds(action, ms -> ms > elapsedMillisecondsLimit, loggerAction);
}
public static <T> T computeFuctionCostMilliseconds(Func0<T> action,
Func1<Long, Boolean> elapsedMillisecondsLimitFunc,
Action1<Long> loggerAction) {
ActionElapseResult<T> result = computeFuctionCostMilliseconds(action);
if (loggerAction != null && elapsedMillisecondsLimitFunc.call(result.getElapsedMilliseconds())) {
loggerAction.call(result.getElapsedMilliseconds());
}
return result.getData();
}
private static <T> ActionElapseResult<T> computeFuctionCostMilliseconds(Func0<T> action) {
long startTime = System.currentTimeMillis();
T data = action.call();
long endTime = System.currentTimeMillis();
return new ActionElapseResult<>(endTime - startTime, data);
}
private static class ActionElapseResult<T> {
private long elapsedMilliseconds;
private T data;
private ActionElapseResult(long ms, T data) {
this.data = data;
this.elapsedMilliseconds = ms;
}
private long getElapsedMilliseconds() {
return elapsedMilliseconds;
}
private T getData() {
return data;
}
}
}