String 为什么字符串的if-else比枚举的switch case快?
由于Java 6没有String 为什么字符串的if-else比枚举的switch case快?,string,if-statement,switch-statement,java-6,String,If Statement,Switch Statement,Java 6,由于Java 6没有字符串的开关大小写,我经常使用下面的代码中的enum将if-else块更改为开关大小写。然而,当我试图检查两个备选方案的性能时,我发现switch case比if-else备选方案慢,这与我的预期相反。下面是我为下面的代码得到的一些结果 Iterations If-Else Switch-Case 1 11810 1609181 10 8214 1059115 100 24141 11
字符串
的开关大小写
,我经常使用下面的代码中的enum将if-else块更改为开关大小写。然而,当我试图检查两个备选方案的性能时,我发现switch case比if-else备选方案慢,这与我的预期相反。下面是我为下面的代码得到的一些结果
Iterations If-Else Switch-Case
1 11810 1609181
10 8214 1059115
100 24141 1152494
1000 183975 1580605
10000 4452698 8710648
100000 7069243 19457585
包条件;
导入java.util.Random;
公共类StringConditionalCheck{
私有静态int-ifElseCounter=0;
专用静态int switchCaseCounter=0;
私有静态最终字符串first=“first”;
私有静态最终字符串second=“second”;
私有静态最终字符串third=“third”;
私有静态最终字符串fourth=“fourth”;
枚举字符串选项{
第一,第二,第三,第四
}
公共静态void main(字符串[]args){
final int iterations=Integer.parseInt(args[0]);
字符串[]用户输入=生成序列输入(迭代);
//使用if-else
long ifelstattime=System.nanoTime();
对于(int i=0;i,因为99%的时间都花在StringOptions=StringOptions.valueOf(输入)上;
,而不是在开关中
基于源代码,StringOptions.valueOf call执行一些复杂的操作,包括在每次调用时构建哈希映射,而String.equals只在字符串中循环一次
将(调用Enum.getConstantDirectory的)的源代码与进行比较。oops!完全忽略了这一点:p只是一个小的更正。它不会在每次调用上构建一个HashMap
,只在第一次调用上。但是,是的,我看到它在返回结果之前执行了几个操作。
package conditionals;
import java.util.Random;
public class StringConditionalCheck {
private static int ifElseCounter = 0;
private static int switchCaseCounter = 0;
private static final String first = "First";
private static final String second = "Second";
private static final String third = "Third";
private static final String fourth = "Fourth";
enum StringOptions {
First, Second, Third, Fourth
}
public static void main(String[] args) {
final int iterations = Integer.parseInt(args[0]);
String[] userInputs = generateUserInputs(iterations);
// Using if-else
long ifelseStartTime = System.nanoTime();
for(int i=0; i<iterations; i++){
useIfElse(userInputs[i]);
}
long ifelseEndTime = System.nanoTime();
long ifElseDuration = ifelseEndTime - ifelseStartTime;
long switchcaseStartTime = System.nanoTime();
for(int i=0; i<iterations; i++){
useSwitchCase(userInputs[i]);
}
long switchcaseEndTime = System.nanoTime();
//just to verify that both options had the same result.
long switchcaseDuration = switchcaseEndTime - switchcaseStartTime;
System.out.println(iterations + " " + ifElseDuration + " " + switchcaseDuration + " " + ifElseCounter + " " + switchCaseCounter);
}
private static String[] generateUserInputs(int numberOfInputs) {
String[] generatedInputs = new String[numberOfInputs];
String[] inputsToChooseFrom = new String[]{first, second, third, fourth};
Random r = new Random();
for (int i = 0; i < numberOfInputs; i++) {
int choice = r.nextInt(4);
generatedInputs[i] = inputsToChooseFrom[choice];
}
return generatedInputs;
}
public static void useSwitchCase(String input) {
StringOptions option = StringOptions.valueOf(input);
switch(option){
case First:
switchCaseCounter += 1;
break;
case Second:
switchCaseCounter += 2;
break;
case Third:
switchCaseCounter += 3;
break;
case Fourth:
switchCaseCounter += 4;
break;
}
}
public static void useIfElse(String input) {
if(input.equals("First")){
ifElseCounter += 1;
}else if(input.equals("Second")){
ifElseCounter += 2;
}else if(input.equals("Third")){
ifElseCounter += 3;
}else if(input.equals("Fourth")){
ifElseCounter += 4;
}
}
}