`
cherami
  • 浏览: 211405 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Google面试题解说性能之七:缓存中间结果

    博客分类:
  • Java
阅读更多

上次已经说了fn的实现不能用来查找符合条件的n,因为这样做比前面的第一个例子中的性能比较差的那个还要差,原因就是有太多的重复计算,如果只是计算一个指定的数的结果,那么那个实现是无与匹敌的。但是我们是讲的性能优化,所以,我们就用它来做,放慢速度,然后使用其它的技巧来提高性能,这次的方法就是简单的使用缓存:
public class GoogleFn {
    private static final int MAX = 2600002;

    private static long start = System.currentTimeMillis();

    private static int[] bases = new int[15];

    private static int[] values = new int[15];

    private static int fn(int number) {
        if (number < 10) {
            return number > 0 ? 1 : 0;
        }
        String s = number + "";
        int length = s.length();
        int end = Integer.parseInt(s.substring(1, length));
        int x = s.charAt(0) - ‘0′;
        int result = 0;
        if (x == 1) {
            result = values[length - 1] + fn(end) + (end + 1);
        } else {
            result = values[length - 1] * x + bases[length - 1] + fn(end);
        }
        return result;
    }

    private static int fnOld(int number) {
        if (number < 10) {
            return number > 0 ? 1 : 0;
        }
        String s = number + "";
        int length = s.length();
        int end = Integer.parseInt(s.substring(1, length));
        int x = s.charAt(0) - ‘0′;
        int result = 0;
        if (x == 1) {
            result = (length - 1) * (int) Math.pow(10, length - 1 - 1) + fnOld(end) + (end + 1);
        } else {
            result = (length - 1) * (int) Math.pow(10, length - 1 - 1) * x + (int) Math.pow(10, length - 1) + fnOld(end);
        }
        return result;
    }

    private static void print(int n) {
        System.out.println("Find " + n + ", " + (System.currentTimeMillis() - start) + "ms");
    }

    public static void main(String[] args) {
        for (int i = 1; i < MAX; i++) {
            if (i == fnOld(i)) {
                print(i);
            }
        }
        bases[0] = 0;
        bases[1] = 10;
        values[0] = 0;
        values[1] = 1;
        for (int i = 2; i < values.length; i++) {
            bases[i] = (int) Math.pow(10, i);
            values[i] = i * (int) Math.pow(10, i - 1);
        }
        start = System.currentTimeMillis();
        for (int i = 1; i < MAX; i++) {
            if (i == fn(i)) {
                print(i);
            }
        }
    }
}
运行结果:
Find 1, 0ms
Find 199981, 1672ms
Find 199982, 1672ms
Find 199983, 1672ms
Find 199984, 1672ms
Find 199985, 1672ms
Find 199986, 1672ms
Find 199987, 1672ms
Find 199988, 1672ms
Find 199989, 1672ms
Find 199990, 1672ms
Find 200000, 1672ms
Find 200001, 1672ms
Find 1599981, 17032ms
Find 1599982, 17032ms
Find 1599983, 17032ms
Find 1599984, 17032ms
Find 1599985, 17032ms
Find 1599986, 17032ms
Find 1599987, 17032ms
Find 1599988, 17032ms
Find 1599989, 17032ms
Find 1599990, 17032ms
Find 2600000, 29875ms
Find 2600001, 29875ms
Find 1, 0ms
Find 199981, 1000ms
Find 199982, 1000ms
Find 199983, 1000ms
Find 199984, 1000ms
Find 199985, 1000ms
Find 199986, 1000ms
Find 199987, 1000ms
Find 199988, 1000ms
Find 199989, 1000ms
Find 199990, 1000ms
Find 200000, 1000ms
Find 200001, 1000ms
Find 1599981, 8563ms
Find 1599982, 8563ms
Find 1599983, 8563ms
Find 1599984, 8563ms
Find 1599985, 8563ms
Find 1599986, 8563ms
Find 1599987, 8563ms
Find 1599988, 8563ms
Find 1599989, 8563ms
Find 1599990, 8563ms
Find 2600000, 14594ms
Find 2600001, 14594ms

可以看到,我们仅仅是缓存了几个简单的中间结果,就将性能提升了一倍。另外请和第一个例子的结果对比一下,我们优化后的结果也比那个差的实现的结果大5倍。


作者: Cherami
原载: 解惑
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
分享到:
评论

相关推荐

    前端面试题:前端框架面试题大全

    前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; ...

    常见的性能测试工程师面试题(附答案)

    "性能测试工程师面试题汇总" 性能测试工程师面试题是指性能测试工程师在面试过程中遇到的常见问题,涵盖了性能测试的基础知识、LoadRunner 的使用、场景设置、脚本录制、参数设置、关联机制、调试技巧等多个方面。 ...

    Java面试题73:数据库优化之缓存.mp4

    Java面试题73:数据库优化之缓存.mp4

    性能测试面试题宝典-覆盖大部分性能专项面试题

    性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖...

    jmeter性能面试问答题

    - 测试数据分析:分析测试结果,评估系统性能。 **LoadRunner并发测试** LoadRunner支持IP伪装、集合点和多机器分布,以模拟真实并发。集合点失败会导致相关操作取消,影响测试的完整性。 **性能测试关注点** - *...

    GOOGLE面试题集锦

    在 IT 行业中,面试是企业选拔人才的重要步骤之一,而 Google 作为全球顶尖的科技公司,其面试方式也备受关注。Google 面试题集锦就是一个集合了 Google 面试题的资源,涵盖了逻辑、数学、算法等多个方面的知识点。 ...

    RabbitMQ相关的面试题和问题解析

    rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:...

    一份就够!史上最全面Python面试题和详解(10个文件)看完啥都会了.zip

    “python面试题搜集(七):史上最全python面试题详解(一).md”和“python面试题搜集(八):史上最全python面试题详解 (二).md”、“python面试题搜集(十):史上最全python面试题详解(四).md”这些文档可能...

    10万字总结java面试题和答案(八股文之一)Java面试题指南

    JavaOOP面试题 Java集合/泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 ...

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    牛客大数据面试题集锦+答案,共523道,46W+字。大厂必备

    大数据面试题V3.0完成了。共523道题,679页,46w+字,来源于牛客870+篇面经。 主要分为以下几部分: Hadoop面试题:100道 Zookeeper面试题:21道 Hive面试题:47道 Flume面试题:11道 Kafka面试题:59到 HBase面试题...

    172份,7701页互联网大厂面试题.pdf

    172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

    2021最新Java面试题合集.zip

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括基础、并发编程、网络、虚拟机、大数据处理以及各种框架。以下是对这些面试题集合的详细解析: 1. **BIO, NIO, AIO, Netty面试题 35道**: - **BIO*...

    Java面试题58:hibernate的缓存.mp4

    Java面试题58:hibernate的缓存.mp4

    Java后端高级面试题(详细概念+试题).pdf.zip

    Java后端高级面试题涉及到众多核心技术和框架,是衡量开发者是否具备高级技能的重要标准。这份“Java后端高级面试题(详细概念+试题).pdf.zip”压缩包包含了多个关键领域的深度探讨,对于准备面试或者提升自身技能的...

    30_分布式缓存相关面试题的回答技巧总结.zip

    本资料"30_分布式缓存相关面试题的回答技巧总结.zip"聚焦于Java领域的分布式缓存,包含了笔记.docx和PPT.pptx两个文件,旨在帮助求职者掌握面试中可能遇到的分布式缓存相关问题及其解答策略。 1. **什么是分布式...

    常见C++面试题汇总(最全c语言面试题)

    常见C++面试题汇总(最全c语言面试题) 所包含文件: 1、华为C++内部培训材料 2、130道面试题.doc 3、C++试题.htm 4、C-C++ 程序设计员应聘常见面试试题深入剖析.mht 5、C语言面试题大汇总之华为面试题.txt 6、C语言...

    前端面试题大全(40个VUE3.0面试题PDF、CSS、JS、REACT、全栈面经、小程序、性能优化)千道面试题,送前端简历模板

    覆盖范围:(40个VUE3.0面试题PDF、CSS面试题、JS面试题、REACT面试题 全栈面试题、小程序面试题、性能优化) # 前端面试题 非常重要 难度都是根据自己学习情况掌握的。 - 不能只靠背面试题 要去理解 面试题背后的...

    面试题.zip

    【标题】:“面试题.zip”是一个集合了多个IT面试常见问题的压缩文件,涵盖了Web开发的多个关键领域,包括Vue.js、移动Web、JavaScript高级、Ajax、Node.js、Web API以及基础JavaScript等。 【描述】:“面试题.zip...

Global site tag (gtag.js) - Google Analytics