在做项目的时候有个需求:有一个索引的集合,要求出最小的索引,索引的格式为1.10.2.4这种,即数字.数字.数字,有多少个部分不确定。我的实现如下,最早是用findMinTableIndexe2(),后来我发现每次都要对result进行split()效率不高,我想在result发生变化的时候在去split,否则就用之前的split结果,由于我写了findMinTableIndexe1(),按我的想法,应该方法1的耗时比方法2的短,因为在方法1中省去了很多的split过程,但测试的结果发现当集合的size比较小的时候(如几百内)确实方法1耗时短,但size增长后(比如几千或更大)反而方法2的耗时更短,没有明白是什么原因,请大家帮忙看下,谢谢。
代码如下,可以通过更改main()方法中的i的大小来调整集合的size.方法的参数大家可以忽略,因为实际中我要根据参数去查找到所需要的集合,在这个测试中集合已经给出。
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;
}
}
java运行时间
代码如下,可以通过更改main()方法中的i的大小来调整集合的size.方法的参数大家可以忽略,因为实际中我要根据参数去查找到所需要的集合,在这个测试中集合已经给出。
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;
}
}
java运行时间
解决方案 »
- 遇到一种奇怪的方式,同时extends Thread与implements Runnable,这时怎么处理呢?请教各位老师
- 获取方法参数名称【觉得不可能的勿进】
- 【分享】今天写了个算法解决了阿拉伯数字和中文大写的相互转换,给大家看看顺便帮我测试下啊
- windows自带的画图程序源代码
- 求助:如何制作java的exe文件??
- 初学struts就遇到障碍
- SOS!!! 海量数据db to db 利用JDBC转移如何提高速度问题
- 那里有介绍JBUILDER6编程的电子书!(提供地址即可)
- 转贴:Applet通讯问题
- 请问Swing游戏地图怎么表示
- java读取excel文件的问题
- ArrayList Vector
1方法比2方法
少了600次split
多了300次判断
多了1800次赋值数据量1000
1方法比2方法
少了2000次split
多了1000次判断
多了6000次赋值证明
1.300次判断+1800次赋值 消耗的资源 小于 600次split
2.1000次判断+6000次赋值 消耗的资源 大于 2000次split能说明什么呢?什么也说明不了结论
1.楼主蛋疼
2.我也蛋疼
现在的问题是将方法1和方法2放在一起运行时,JVM到底会做什么样的优化呢?从而导致后面的运行会更快,我想有点太深入了,希望有人能解答吧。