首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

一个关于运行时间的纳闷

2013-08-01 
一个关于运行时间的疑惑在做项目的时候有个需求:有一个索引的集合,要求出最小的索引,索引的格式为1.10.2.4

一个关于运行时间的疑惑
在做项目的时候有个需求:有一个索引的集合,要求出最小的索引,索引的格式为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 运行时间
[解决办法]
数据量300:
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.我也蛋疼

热点排行
Bad Request.