From d568b15acf6230d1ece83846fea4969f3e77bd4f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 5 Apr 2024 21:26:52 +0200 Subject: [PATCH] LibURL: Avoid expensive IDNA::to_ascii() for all-ASCII domain strings 20% of CPU usage when loading https://utah.edu/ was spent doing these ASCII conversions in URL parsing. --- Userland/Libraries/LibURL/Parser.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Userland/Libraries/LibURL/Parser.cpp b/Userland/Libraries/LibURL/Parser.cpp index 032db387e3c..d91843dfb55 100644 --- a/Userland/Libraries/LibURL/Parser.cpp +++ b/Userland/Libraries/LibURL/Parser.cpp @@ -580,6 +580,15 @@ static ErrorOr domain_to_ascii(StringView domain, bool be_strict) { // 1. Let result be the result of running Unicode ToASCII with domain_name set to domain, UseSTD3ASCIIRules set to beStrict, CheckHyphens set to false, CheckBidi set to true, CheckJoiners set to true, Transitional_Processing set to false, and VerifyDnsLength set to beStrict. [UTS46] // 2. If result is a failure value, domain-to-ASCII validation error, return failure. + + // OPTIMIZATION: Fast path for all-ASCII domain strings. + if (all_of(domain, is_ascii)) { + // 3. If result is the empty string, domain-to-ASCII validation error, return failure. + if (domain.is_empty()) + return Error::from_string_literal("Empty domain"); + return String::from_utf8_without_validation(domain.bytes()); + } + Unicode::IDNA::ToAsciiOptions const options { Unicode::IDNA::CheckHyphens::No, Unicode::IDNA::CheckBidi::Yes,