我想知道一个大的 switch 语句和几个小的 switch 语句之间是否有性能差异。
包含数百个案例的大型 switch 语句。
switch(quest){
case 1: quest1(); break;
case 2: quest2(); break;
.
.
.
case 196: quest196(); break;
case 197: quest197(); break;
.
.
.
}
或者几个较小的 switch 语句,每个语句有 30 个案例。
if (quest <= 30) {
switch (quest) {
case 1: quest1(); break;
case 2: quest2(); break;
case 3: quest3(); break;
.
.
case 30: quest30(); break;
default:
return;
}
} else if (quest <= 60) {
switch (quest) {
case 31: quest31(); break;
case 32: quest32(); break;
case 33: quest33(); break;
.
.
.
case 60: quest60(); break;
default:
return;
}
}
.
.
.
另外,我知道反射会更容易编码,但这会导致很大的开销吗?
类似这样的东西。
try {
Method method =Logic.class.getMethod("quest"+quest);
method.invoke(this);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
提前致谢。
最佳答案
大型 switch
与包含较小的 if
/then
/else
语句链之间的区别switch
是指单个 switch
将在一次查找中找到要执行的代码,而条件链在到达 switch< 之前可能需要多次单独检查
利益声明。一旦找到 switch 语句,几乎无论有多少个 case 标签,执行调度所需的时间都大致相同。单个 switch
语句也更具可读性,因此我更喜欢它而不是条件链。
虽然反射确实有开销,但这并不可怕,因此如果您的 questNNN
方法不是非常快,反射的开销不会有太大影响。您甚至可以通过准备一个 Method
对象数组来加速它,并预先填充它以避免 Logic.class.getMethod("quest"+quest)
调用您发送调用的时间。
最后,您可以创建一个 Runnable
对象数组,并将 questNNN
的调用封装在其中:
Runnable[] dispatch = new Runnable[] {
new Runnable() { public void run() { quest0(); } }
, new Runnable() { public void run() { quest1(); } }
, new Runnable() { public void run() { quest2(); } }
, new Runnable() { public void run() { quest3(); } }
, new Runnable() { public void run() { quest4(); } }
...
, new Runnable() { public void run() { quest59(); } }
, new Runnable() { public void run() { quest60(); } }
};
现在您可以调用 dispatch[NNN].run()
来调用 questNNN
方法。
关于java - 一个大的 switch 语句还是几个小的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026780/