关于java:基于用户偏好的Call Method,更快/更好

Call Method based on user preferences, which is faster/better

我们有x个方法,我们喜欢调用与用户设置相关的方法,以下哪种方法运行得更快?< BR>

案例1:

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

案例2:案例:

1
2
3
4
5
6
7
8
9
10
11
 int userSetting = 1;
 switch(userSettings) {
     case 0:
         Method0();
     break;
     case 1:
         Method1();
     break;
     ...
     ...
 }

案例3:案例:

1
2
3
4
5
6
int userSetting = 1;
if(userSetting == 0){
    Method0();
} else if(userSetting == 1){
    Method1();
} else....

也:

  • 你认为一个人即使慢一点也比其他人好吗?如果是,为什么?< BR>
  • 还有另一种方法,巫婆更好/更快……请告诉我们。

谢谢


选项1使用反射,因此可能会变慢,正如javadocs所指出的:

1
2
3
4
5
6
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更容易。

我建议您使用一个完全不同的选项:使用策略设计模式。它比其他选项更快、更易读。


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

伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
 }
}

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

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

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

1
2
3
4
5
6
7
8
Factory factory = new SlowFactory();
Calculator calc = factory.createCalculator();
Operation op = factory.createSomeOtherOperation();


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

正如您所看到的,除了工厂类,对于慢情况和快速情况,代码是相同的,并且您可以通过根据用户偏好来决定来创建代码。尤其是如果您有更多这样的操作,比如计算器和我的操作示例,那么您将希望您的代码不依赖于任何地方的用户偏好,而是只在一个地方。


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

2和3之间的差异可以忽略不计,但一般来说,2不应该比3慢,因为编译器可以将开关更改为级联的if,如果它认为它更快的话。另外,由于开关的可读性明显优于if/else级联,所以无论如何,我还是要使用第二个。

尽管我非常肯定这并不是瓶颈——即使使用反射……


我认为最慢的版本是第一。反射很复杂,在运行时完成。对于第2和第3行,您可以查看Java:CaseSt抑或IF语句效率透视图。

另一种方法:在执行过程中,用户的配置会改变吗?否则,启动时只做一次决定。


案例1使用反射,在方法2和3之外受到性能冲击。

在方法2和3之间,性能差异最多是边际的。您必须问自己,是否有任何可能的性能提高是真正合理的代码可读性?除非是在一个真正有限的微芯片或类似的芯片上,否则我总是回答不。

除了性能方面的观点,正如@hoevercraft full of eels已经指出的那样,您最好重新设计程序以完全避免一系列条件子句。