一个关于运行时间的疑惑
在做项目的时候有个需求:有一个索引的集合,要求出最小的索引,索引的格式为1.10.2.4这种,即数字.数字.数字,有多少个部分不确定。我的实现如下,最早是用findMinTableIndexe2(),后来我发现每次都要对result进行split()效率不高,我想在result发生变化的时候在去split,否则就用之前的split结果,由于我写了findMinTableIndexe1(),按我的想法,应该方法1的耗时比方法2的短,因为在方法1中省去了很多的split过程,但测试的结果发现当集合的size比较小的时候(如几百内)确实方法1耗时短,但size增长后(比如几千或更大)反而方法2的耗时更短,没有明白是什么原因,请大家帮忙看下,谢谢。
代码如下,可以通过更改main()方法中的i的大小来调整集合的size.方法的参数大家可以忽略,因为实际中我要根据参数去查找到所需要的集合,在这个测试中集合已经给出。
java 运行时间
public class FindMinIndex {
private static Set<String> tableIndexSet = new HashSet<String>();
// private static Logger logger = LogManager.getLogger(FindMinIndex.class);
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
tableIndexSet.add(i + ".10.2.3");
tableIndexSet.add(i + ".15.5.4");
tableIndexSet.add(i + ".20.2.4");
tableIndexSet.add(i + ".5.2.4");
tableIndexSet.add(i + ".5.2.3");
tableIndexSet.add(i + ".5.2.6");
}
//System.out.println(tableIndexSet.size());
//tableIndexSet.clear();
long begin = System.currentTimeMillis();
System.out.println(findMinTableIndexe1("1"));
long end = System.currentTimeMillis();
System.out.println("1 use time:" + (end - begin));
begin = System.currentTimeMillis();
System.out.println(findMinTableIndexe2("1"));
end = System.currentTimeMillis();
System.out.println("2 use time:" + (end - begin));
}
public static String findMinTableIndexe1(final String tableOid) {
String result = null;
boolean isResultChange = false;
String[] partsOfResult = null;
String[] partsOfIndex;
for (String index : tableIndexSet) {
try {
if (result == null) {
result = index;
isResultChange = true;
continue;
}
partsOfIndex = index.split("\\.");
if (isResultChange) {
partsOfResult = result.split("\\.");
isResultChange = false;
}
for (int i = 0; i < partsOfIndex.length; i++) {
if (Integer.parseInt(partsOfIndex[i]) < Integer.parseInt(partsOfResult[i])) {
result = index;
isResultChange = true;
break;
}else if(Integer.parseInt(partsOfIndex[i]) > Integer.parseInt(partsOfResult[i])){
break;
}
}
} catch (NumberFormatException e) {
// logger.error("{} can not parse to Integer. You should not use this method to get the minimum index!", index);
}
}
return result;
}
public static String findMinTableIndexe2(final String tableOid) {
String result = null;
String[] partsOfResult = null;
String[] partsOfIndex;
for (String index : tableIndexSet) {
try {
if (result == null) {
result = index;
continue;
}
partsOfIndex = index.split("\\.");
partsOfResult = result.split("\\.");
for (int i = 0; i < partsOfIndex.length; i++) {
if (Integer.parseInt(partsOfIndex[i]) < Integer.parseInt(partsOfResult[i])) {
result = index;
break;
} else if(Integer.parseInt(partsOfIndex[i]) > Integer.parseInt(partsOfResult[i])){
break;
}
}
} catch (NumberFormatException e) {
// logger.error("{} can not parse to Integer. You should not use this method to get the minimum index!", index);
}
}
return result;
}
}