0
0
mirror of https://github.com/neon-mmd/websurfx.git synced 2024-11-23 06:28:23 -05:00

perf: reduce branch predictions by reducing conditional code branches (#486)

This commit is contained in:
neon_arch 2024-03-01 01:04:35 +03:00
parent 5f0edde549
commit c83863608a
4 changed files with 63 additions and 33 deletions

View File

@ -72,8 +72,24 @@ impl SearchEngine for Mojeek {
"Yep", "Yep",
"You", "You",
]; ];
let qss = search_engines.join("%2C"); let qss = search_engines.join("%2C");
let safe = if safe_search == 0 { "0" } else { "1" };
// A branchless condition to check whether the `safe_search` parameter has the
// value 0 or not. If it is zero then it sets the value 0 otherwise it sets
// the value to 1 for all other values of `safe_search`
//
// Moreover, the below branchless code is equivalent to the following code below:
//
// ```rust
// let safe = if safe_search == 0 { 0 } else { 1 }.to_string();
// ```
//
// For more information on branchless programming. See:
//
// * https://piped.video/watch?v=bVJ-mWWL7cE
let safe =
&((u8::from(safe_search == 0) * 0) + (u8::from(safe_search != 0) * 1)).to_string();
// Mojeek detects automated requests, these are preferences that are // Mojeek detects automated requests, these are preferences that are
// able to circumvent the countermeasure. Some of these are // able to circumvent the countermeasure. Some of these are

View File

@ -44,11 +44,20 @@ impl SearchEngine for Searx {
client: &Client, client: &Client,
mut safe_search: u8, mut safe_search: u8,
) -> Result<Vec<(String, SearchResult)>, EngineError> { ) -> Result<Vec<(String, SearchResult)>, EngineError> {
// Page number can be missing or empty string and so appropriate handling is required // A branchless condition to check whether the `safe_search` parameter has the
// so that upstream server recieves valid page number. // value greater than equal to three or not. If it is, then it modifies the
if safe_search == 3 { // `safesearch` parameters value to 2.
safe_search = 2; //
}; // Moreover, the below branchless code is equivalent to the following code below:
//
// ```rust
// safe_search = u8::from(safe_search == 3) * 2;
// ```
//
// For more information on branchless programming. See:
//
// * https://piped.video/watch?v=bVJ-mWWL7cE
safe_search = u8::from(safe_search >= 3) * 2;
let url: String = format!( let url: String = format!(
"https://searx.be/search?q={query}&pageno={}&safesearch={safe_search}", "https://searx.be/search?q={query}&pageno={}&safesearch={safe_search}",

View File

@ -154,8 +154,8 @@ impl SearchResults {
} }
/// A setter function that sets the filtered to true. /// A setter function that sets the filtered to true.
pub fn set_filtered(&mut self) { pub fn set_filtered(&mut self, filtered: bool) {
self.filtered = true; self.filtered = filtered;
} }
/// A getter function that gets the value of `engine_errors_info`. /// A getter function that gets the value of `engine_errors_info`.

View File

@ -70,8 +70,8 @@ pub async fn search(
}); });
search_settings.safe_search_level = get_safesearch_level( search_settings.safe_search_level = get_safesearch_level(
&Some(search_settings.safe_search_level), params.safesearch,
&params.safesearch, search_settings.safe_search_level,
config.safe_search, config.safe_search,
); );
@ -227,12 +227,12 @@ async fn results(
search_results search_results
} }
}; };
if results.engine_errors_info().is_empty() let (engine_errors_info, results_empty_check, no_engines_selected) = (
&& results.results().is_empty() results.engine_errors_info().is_empty(),
&& !results.no_engines_selected() results.results().is_empty(),
{ results.no_engines_selected(),
results.set_filtered(); );
} results.set_filtered(engine_errors_info & results_empty_check & !no_engines_selected);
cache cache
.cache_results(&[results.clone()], &[cache_key.clone()]) .cache_results(&[results.clone()], &[cache_key.clone()])
.await?; .await?;
@ -269,24 +269,29 @@ fn is_match_from_filter_list(
Ok(false) Ok(false)
} }
/// A helper function to modify the safe search level based on the url params. /// A helper function to choose the safe search level value based on the URL parameters,
/// The `safe_search` is the one in the user's cookie or /// cookie value and config value.
/// the default set by the server config if the cookie was missing.
/// ///
/// # Argurments /// # Argurments
/// ///
/// * `url_level` - Safe search level from the url. /// * `safe_search_level_from_url` - Safe search level from the URL parameters.
/// * `safe_search` - User's cookie, or the safe search level set by the server /// * `cookie_safe_search_level` - Safe search level value from the cookie.
/// * `config_level` - Safe search level to fall back to /// * `config_safe_search_level` - Safe search level value from the config file.
fn get_safesearch_level(cookie_level: &Option<u8>, url_level: &Option<u8>, config_level: u8) -> u8 { ///
match url_level { /// # Returns
Some(url_level) => { ///
if *url_level >= 3 { /// Returns an appropriate safe search level value based on the safe search level values
config_level /// from the URL parameters, cookie and the config file.
} else { fn get_safesearch_level(
*url_level safe_search_level_from_url: Option<u8>,
} cookie_safe_search_level: u8,
} config_safe_search_level: u8,
None => cookie_level.unwrap_or(config_level), ) -> u8 {
} (u8::from(safe_search_level_from_url.is_some())
* ((u8::from(config_safe_search_level >= 3) * config_safe_search_level)
+ (u8::from(config_safe_search_level < 3)
* safe_search_level_from_url.unwrap_or_else(|| 0))))
+ (u8::from(safe_search_level_from_url.is_none())
* ((u8::from(config_safe_search_level >= 3) * config_safe_search_level)
+ (u8::from(config_safe_search_level < 3) * cookie_safe_search_level)))
} }