文档章节

项目重构多态和switch性能对比

深山
 深山
发布于 2015/01/15 10:18
字数 308
阅读 1697
收藏 0

测试代码:

public class Client {
  public static void main(String[] args) {
    long time = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        getA(new G());
    }
    System.out.println("多态耗时: "+(System.currentTimeMillis()-time));
    
    
    
    time = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        getB(i);
    }
    System.out.println("swtch耗时: "+(System.currentTimeMillis()-time));
  }
  public static String getA(A a){
      return a.getName();
  }
  public static String getB(int i){
      switch (i) {
        case 1:
            return "A";
        case 2:
            return "B";
        case 3:
            return "C";
        case 4:
            return "D";
        case 5:
            return "E";
        case 6:
            return "F";
        case 7:
            return "G";
        default:
            return "H";
    }
  }

}
class A{
  public static String name = "A";
  public String getName(){
    return name;
  }
}
class B extends A{
  public static String name = "B";
  public String getName(){
    return name;
  }
}
class C extends A{
    public static String name = "C";
    public String getName(){
        return name;
    }
}
class D extends A{
    public static String name = "D";
    public String getName(){
        return name;
    }
}
class E extends A{
    public static String name = "E";
    public String getName(){
        return name;
    }
}
class F extends A{
    public static String name = "F";
    public String getName(){
        return name;
    }
}
class G extends A{
    public static String name = "G";
    public String getName(){
        return name;
    }
}

运行结果:

多态耗时: 16
swtch耗时: 5



结论: 多态比较耗时, 非特殊需求, 建议使用switch,

© 著作权归作者所有

深山
粉丝 1
博文 10
码字总数 2441
作品 0
朝阳
私信 提问
加载中

评论(1)

BuN_Ny
BuN_Ny
如果代码很多,每个类型处理一种逻辑,非常适合多态。代码清晰易读是第一位的。1000000次只有10毫秒的差距。不要过早地进行性能优化。你的结论正好反了,除非有特殊需求(如性能出现瓶颈),才可以容忍晦涩的代码。
Replace Conditional with Polymorphism (以多态取代条件表达式)

Summary: 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为。将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。 Motivation: 在面向对象...

忆瑶
2014/03/28
602
0
《重构:改善既有代码的设计》第(1-3)章笔记

1.任何不会被修改的变量都可以作为参数传入新的函数,至于会被修改的变量就需要格外小心。(p9) 2.重构技术就是以微小的步伐修改程序。如果你犯下错误,很容易便可以发现它。(p13) 3.好的代码...

吞吞吐吐的
2017/09/13
0
0
Replace Type Code with Subclasses (以子类取代类型码)

Summary: 你有一个不可变的类型码,它会影响类的行为。以子类取代这个类型码。 动机: 如果你面对的类型码不会影响宿主类的行为,可以使用Replace Type Code with Class来处理它们。但如果类...

忆瑶
2014/03/25
171
0
开发中滥用面向对象,你是否违背了编程原则

Switch 声明 Switch 声明(Switch Statements) 你有一个复杂的 语句或 序列语句。 问题原因 面向对象程序的一个最明显特征就是:少用 和 语句。从本质上说, 语句的问题在于重复( 序列也同样...

李红欧巴
05/09
846
1
PHP 杂谈《微信H5棋牌牛牛源码搭建租售平台》之 重新组织你的函数

微信H5棋牌牛牛源码搭建租售平台原文地址:http://h5.fanshubbs.com 联系方式Q1687054422 思维导图 点击下图,可以看大图。 介绍 我把我比较喜欢的和比较关注的地方写下来和大家分享。上次我...

13105848030
2018/02/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部