基于用户偏好的呼叫方法,更快/更好

时间:2011-10-16 12:50:03

标签: java optimization

我们有X方法,我们喜欢调用一个相对于用户设置的方法,以下哪个运行得更快?

案例1:

int userSetting = 1;
Method method = Class.getDeclaredMethod("Method" + userSetting);
method.invoke();


案例2:

 int userSetting = 1;
 switch(userSettings) {
     case 0:
         Method0();
     break;
     case 1:
         Method1();
     break;
     ...
     ...
 }


案例3:

int userSetting = 1;
if(userSetting == 0){
    Method0();
} else if(userSetting == 1){
    Method1();
} else....

此外:

  • 你认为即使速度较慢,其他人的做法也更好吗?如果是,为什么?
  • 另一种方式是女巫更好/更快......请告诉我们。

由于

5 个答案:

答案 0 :(得分:5)

选项1使用reflection,因此可能会更慢,因为javadocs表示:

Performance Overhead
    Because reflection involves types that are dynamically resolved, certain Java 
    virtual machine optimizations can not be performed. Consequently, reflective 
    operations have slower performance than their non-reflective counterparts, 
    and should be avoided in sections of code which are called frequently in 
    performance-sensitive applications.

然而,维护此选项比选项2 + 3更容易。

我建议您使用完整的不同选项:使用strategy design pattern。与备选方案相比,它更可能更快,更易读。

答案 1 :(得分:2)

正如amit所指出的,这是战略设计模式的一个案例。另外,我想举一个简短的例子:

伪码:

public interface Calculator {
 public int calc(...);
}

public class FastCalc implements Calculator {
 public int calc(...) {
   // Do the fast stuff here
 }
}

public class SlowCalc implements Calculator {
 public int calc(...) {
   // Do the slow stuff here
 }
}

然后,您的主程序会根据用户偏好决定使用哪种策略

 Calculator calc = userPreference.getBoolean("fast") ? new FastCalc() : new SlowCalc();
 int result = calc.calc(...);

这是因为稍后您可以使用Factory模式为各种操作创建多个策略:

Factory factory = new SlowFactory();
Calculator calc = factory.createCalculator();
Operation op = factory.createSomeOtherOperation();


Factory factory = new FastFactory();
Calculator calc = factory.createCalculator();
Operation op = factory.createSomeOtherOperation();

如您所见,除了工厂类之外,慢速大小写和快速大小写的代码相同,您可以根据用户首选项来决定。特别是如果您有更多此类操作,例如计算器和我的操作示例,那么您将希望您的代码不依赖于用户首选项无处不在,而只是在一个地方。

答案 2 :(得分:0)

案例 1 使用reflection并且遭遇超出 2 3 方法的性能影响。

在方法之间 2 & 3 性能差异最多边缘。您必须问自己,是否有任何可能的性能提升 真的 对代码可读性的合理性?除非是真正有限的微芯片或类似的总是回答


除了性能视图外,因为 @HoeverCraft Full Of Eels 已经指出你可能更好地重新设计程序以完全避免一系列条件子句。

答案 3 :(得分:0)

我认为明显最慢的版本是第一名。反射很复杂,在运行时完成。对于2号和3号,您可以查看Java: case-statment or if-statement efficiency perspective

另一种方式:用户的配置是否可以在执行期间发生变化?如果没有,请在启动时做出一次决定。

答案 4 :(得分:0)

正如所有其他人所说,#1很可能是最慢的。

2和3之间的差异可以忽略不计,但通常#2不应该比#3慢,因为编译器可以将开关更改为级联,如果它认为它会更快。此外,由于开关明显比if / else级联更易读,所以无论如何我都会选择。

虽然我非常确定这不是瓶颈 - 即使使用反射......