基于参数类型的java Speed profiler抽象方法或开关
问题细节。我需要创建一个框架来执行各种检查,比如: -A日期在B日期和C日期之间吗? -整数A是否大于整数B且小于整数C? 等 到目前为止,我正在考虑两种可能的实现方式,下面详细介绍
Impl1-基于检查类型,使用单个类执行检查
import java.sql.Time;
import java.util.Date;
public class SearchManager {
public final static int SEARCH_TYPE_DATE = 0;
public final static int SEARCH_TYPE_INT = 1;
public final static int SEARCH_TYPE_STRING = 2;
public final static int SEARCH_TYPE_TIME = 3;
private final int searchType;
public SearchManager(int searchType) {
this.searchType = searchType;
}
public final boolean doCompare(Object minValue, Object maxValue, Object toBeCompared) {
switch (this.searchType) {
case SEARCH_TYPE_DATE: {
return compareDates((Date) minValue, (Date) maxValue, (Date) toBeCompared);
}
case SEARCH_TYPE_INT: {
return compareIntegers((Integer) minValue, (Integer) maxValue, (Integer) toBeCompared);
}
case SEARCH_TYPE_STRING: {
return compareStrings(String.valueOf(minValue), String.valueOf(maxValue), String.valueOf(toBeCompared));
}
case SEARCH_TYPE_TIME: {
return compareTimes((Time) minValue, (Time) maxValue, (Time) toBeCompared);
}
default:
return false;
}
}
private boolean compareDates(Date min, Date max, Date toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareIntegers(Integer min, Integer max, Integer toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareStrings(String min, String max, String toBeCompared) {
boolean result = false;
// actual comparison
return result;
}
private boolean compareTimes(Time min, Time max, Time toBeComparedDate) {
boolean result = false;
// actual comparison
return result;
}
}
Impl2——使用抽象类或接口,并为每种搜索类型实现比较方法
public abstract class AbstractSearch {
public final static int SEARCH_TYPE_DATE = 0;
public final static int SEARCH_TYPE_INT = 1;
public final static int SEARCH_TYPE_STRING = 2;
public final static int SEARCH_TYPE_TIME = 3;
public AbstractSearch() {
super(); //just for fun
}
protected abstract boolean doCompare(Object minValue, Object maxValue, Object toBeComparedValue);
}
现在,在这个例子中,对于X种不同的搜索类型,正如您所想象的,AbstractSearch
的X个实现将被创建
想象一下,来自第二个实现的类AbstractSearch
将需要执行额外的任务,而不是方法doCompare(..)
,这就是为什么接口不是这个解决方案的第一个候选者,并编写类似于
public abstract class AbstractSearch implements Searcheable
这对我没有多大帮助,因为AbstractSearch
或SearchManager
将处理所有比较,并且,如果需要新的比较类型,将为来自Impl1或Impl2的相应超类声明一个额外的类型/子类实现
我的问题是哪种实现更快?这非常重要,因为比较过程将在包含数千个元素的循环中调用。 谢谢你阅读/回答我的问题
EDIT1:另外,请记住,对于第二个示例,minValue和maxValue将从扩展AbstractSearch
的类中提取,对于第一个示例,将从扩展SearchManager
的类中提取。这些实现实际上是图形组件,允许用户输入最小值和最大值,然后,这些值将在循环中与表中显示的对象的某些bean属性进行比较
EDIT2:我正在使用虚拟实现进行一些基准测试(我只想比较方法调用时间和开关执行时间)。结果是。。令人惊讶的是:
- 使用AbstractSearch(500k循环):-0.047秒
- 使用SearchManager(500k循环):-0.422秒
有了这些结果,可以安全地假设使用继承比使用开关快得多(或者更糟的是使用if-else测试)
共 (0) 个答案