Es ist 2020, der Scala-Compiler generiert im Pattern-Matching-Fall einen weitaus effizienteren Bytecode. Die Leistungskommentare in der akzeptierten Antwort sind im Jahr 2020 irreführend.
Der durch Musterübereinstimmung generierte Bytecode stellt eine harte Konkurrenz zu if-else-Gewinnern dar, die zuweilen viel bessere und konsistentere Ergebnisse erzielen.
Man kann Pattern Match oder If-else verwenden, je nach Situation und Einfachheit. Der Mustervergleich hat jedoch eine schlechte Leistung. Die Schlussfolgerung ist nicht mehr gültig.
Sie können das folgende Snippet ausprobieren und die Ergebnisse anzeigen:
def testMatch(password: String, enteredPassword: String) = {
val entering = System.nanoTime()
password == enteredPassword match {
case true => {
println(s"User is authenticated. Time taken to evaluate True in match : ${System.nanoTime() - entering}"
)
}
case false => {
println(s"Entered password is invalid. Time taken to evaluate false in match : ${System.nanoTime() - entering}"
)
}
}
}
testMatch("abc", "abc")
testMatch("abc", "def")
Pattern Match Results :
User is authenticated. Time taken to evaluate True in match : 1798
Entered password is invalid. Time taken to evaluate false in match : 3878
If else :
def testIf(password: String, enteredPassword: String) = {
val entering = System.nanoTime()
if (password == enteredPassword) {
println(
s"User is authenticated. Time taken to evaluate if : ${System.nanoTime() - entering}"
)
} else {
println(
s"Entered password is invalid.Time taken to evaluate else ${System.nanoTime() - entering}"
)
}
}
testIf("abc", "abc")
testIf("abc", "def")
If-else time results:
User is authenticated. Time taken to evaluate if : 65062652
Entered password is invalid.Time taken to evaluate else : 1809
PS: Da die Zahlen nanospezifisch sind, stimmen die Ergebnisse möglicherweise nicht genau mit den exakten Zahlen überein, aber das Argument zur Leistung gilt.