空间换时间,轻松提高性能100倍

原创 2017年02月24日 13:04:24

空间换时间的最常用场景就是缓存,为了提高性能可以设置不同类型的缓存。下面是我遇到的一个小问题。

问题描述

在统计股票的历史收益时,涉及到对交易日的操作,比如获取某个日期偏移一定天数后的交易日。由于交易日是比较固定的数据,在系统启动启动之初,就加载到缓存中,保存在一个ArrayList中,定义了一个方法getDate(String from, int offset)实现偏移取值。原始代码如下:

    public String getDateFast(String fromDate, int offset) {
        if(tradingList.isEmpty()){
            initialize();
        }

        int index = tradingList.indexOf(fromDate);
        if(index == -1){
            return null;
        }

        index -= offset;
        return tradingList.get(index);
    }

上述代码省略了和技术无关的业务细节。

在某一个业务场景下,需要对两万多条数据调用该方法,打印的日志如下:
这里写图片描述
从日志看出,两万条数据竟然花费了9秒多,这的是不可以接受的。

问题分析

因为tradingList是用ArrayList存储,那么每次的indexOf都是需要做一个全循环,所以indexOf操作是性能的瓶颈。

解决方法

找到了原因也就有解决办法。最快的查找是O(1),符合这个条件的存储结构是HashMap。所以在初始化时,除了用ArrayList存储日期序列,用HashMap存储日期所在的索引。代码如下:

    private void initialize(){
        tradingList.clear();
        dateIndexMap.clear();

        //从数据库中加载交易日的序列
        tradingList = marketCalendarDao.findDateByIsTradingSortDateDesc(true);

        //建立日期和位置的对应关系
        for(int index = 0; index < tradingList.size(); index += 1){
            dateIndexMap.put(tradingList.get(index), index);
        }
    }

    public String getDateFast(String fromDate, int offset) {
        if(tradingList.isEmpty()){
            initialize();
        }

        if(dateIndexMap.containsKey(fromDate)){
            int index = dateIndexMap.get(fromDate);
            index -= offset;
            return tradingList.get(index);
        }
        return null;
    }

最后的运行效果:
这里写图片描述

版权声明:原创文章,欢迎转载,转载请注明出处和原文链接

空间换时间,轻松提高性能100倍

空间换时间的最常用场景就是缓存,为了提高性能可以设置不同类型的缓存
  • mydeman
  • mydeman
  • 2017年02月24日 13:04
  • 958

提高 Java 代码的性能

尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换   很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环,以提高程序的性能。但在 Java 语言规范中,并没有...
  • bananabear
  • bananabear
  • 2007年03月20日 23:21
  • 516

性能优化:空间换时间

问题背景                      在程序开发过程中,我们对于数据的处理,会有一些校验。         校验分为两种:简单校验和复杂校验。        对于一些简单的校验,如用户...
  • zc474235918
  • zc474235918
  • 2015年10月28日 21:33
  • 3166

代码时间换空间以及空间换时间

void swap(int a, int b) { int c; c=a; a=b;b=a; } //--->空优 void swap(int a, int b) { a=a+b;b=a-b;a...
  • u013443618
  • u013443618
  • 2016年05月30日 17:57
  • 1146

性能优化——提升Win10系统反应速度

性能优化——提升Win10系统反应速度 来源:Win7之家    浏览量: 3969 次      2015-04-16 16:23 性能优化——提升Win10系统反应速度    一个系统使用...
  • zp357252539
  • zp357252539
  • 2016年12月26日 22:51
  • 1097

关于大小型项目如何最大限度提高WebAPi性能

性能提升一:JSON序列化器(Jil) 在.NET里面默认的序列化器是JavaScriptSrializer,都懂的,性能实在是差,后来出现了Json.NET,以至于在目前创建项目时默认用的序列化器...
  • n9nzjx57bf
  • n9nzjx57bf
  • 2017年05月17日 09:45
  • 584

用空间换时间 —— Java虚拟机的算法实现

HotSpot虚拟机是如何实现可达性分析算法的?
  • hzy38324
  • hzy38324
  • 2017年08月13日 16:36
  • 1743

关于时间空间转换在java编程中的使用

如题:如果对于计算机而言所有的
  • wnm23
  • wnm23
  • 2014年06月14日 20:30
  • 852

关于JavaFX中内存泄露问题

最近参与了一个JavaFX的项目,负责其中的性能测试等工作,作为一个“用户”在测试的过程中,发现其中有很严重的稳定性问题。主要表现为:操作一段时间后,VisualVM监测占用内存持续攀升,最终界面卡死...
  • luanjiyang
  • luanjiyang
  • 2013年07月30日 19:48
  • 2022

JavaFX学习之道:详解JavaFX架构与框架

JavaFX 2.0平台是基于Java技术的富客户端平台。它使应用程序开发者更加容易的开发和部署跨平台的富互联网应用(RIA)。JavaFX 2.0文档包含了JavaFX 2.0所提供的功能的概述。 ...
  • u011511429
  • u011511429
  • 2014年07月25日 11:18
  • 1849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:空间换时间,轻松提高性能100倍
举报原因:
原因补充:

(最多只允许输入30个字)