我们有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....
此外:
由于
答案 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级联更易读,所以无论如何我都会选择。
虽然我非常确定这不是瓶颈 - 即使使用反射......