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 |
正如您所看到的,除了工厂类,对于慢情况和快速情况,代码是相同的,并且您可以通过根据用户偏好来决定来创建代码。尤其是如果您有更多这样的操作,比如计算器和我的操作示例,那么您将希望您的代码不依赖于任何地方的用户偏好,而是只在一个地方。
正如所有其他人所说,1最有可能是最慢的。
2和3之间的差异可以忽略不计,但一般来说,2不应该比3慢,因为编译器可以将开关更改为级联的if,如果它认为它更快的话。另外,由于开关的可读性明显优于if/else级联,所以无论如何,我还是要使用第二个。
尽管我非常肯定这并不是瓶颈——即使使用反射……
我认为最慢的版本是第一。反射很复杂,在运行时完成。对于第2和第3行,您可以查看Java:CaseSt抑或IF语句效率透视图。
另一种方法:在执行过程中,用户的配置会改变吗?否则,启动时只做一次决定。
案例1使用反射,在方法2和3之外受到性能冲击。
在方法2和3之间,性能差异最多是边际的。您必须问自己,是否有任何可能的性能提高是真正合理的代码可读性?除非是在一个真正有限的微芯片或类似的芯片上,否则我总是回答不。
除了性能方面的观点,正如@hoevercraft full of eels已经指出的那样,您最好重新设计程序以完全避免一系列条件子句。