mirror of
https://github.com/neon-mmd/websurfx.git
synced 2024-11-22 22:18:23 -05:00
⚡ perf: reduce branch predictions by reducing conditional code branches (#486)
This commit is contained in:
parent
5f0edde549
commit
c83863608a
@ -72,8 +72,24 @@ impl SearchEngine for Mojeek {
|
||||
"Yep",
|
||||
"You",
|
||||
];
|
||||
|
||||
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
|
||||
// able to circumvent the countermeasure. Some of these are
|
||||
|
@ -44,11 +44,20 @@ impl SearchEngine for Searx {
|
||||
client: &Client,
|
||||
mut safe_search: u8,
|
||||
) -> Result<Vec<(String, SearchResult)>, EngineError> {
|
||||
// Page number can be missing or empty string and so appropriate handling is required
|
||||
// so that upstream server recieves valid page number.
|
||||
if safe_search == 3 {
|
||||
safe_search = 2;
|
||||
};
|
||||
// A branchless condition to check whether the `safe_search` parameter has the
|
||||
// value greater than equal to three or not. If it is, then it modifies the
|
||||
// `safesearch` parameters value to 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!(
|
||||
"https://searx.be/search?q={query}&pageno={}&safesearch={safe_search}",
|
||||
|
@ -154,8 +154,8 @@ impl SearchResults {
|
||||
}
|
||||
|
||||
/// A setter function that sets the filtered to true.
|
||||
pub fn set_filtered(&mut self) {
|
||||
self.filtered = true;
|
||||
pub fn set_filtered(&mut self, filtered: bool) {
|
||||
self.filtered = filtered;
|
||||
}
|
||||
|
||||
/// A getter function that gets the value of `engine_errors_info`.
|
||||
|
@ -70,8 +70,8 @@ pub async fn search(
|
||||
});
|
||||
|
||||
search_settings.safe_search_level = get_safesearch_level(
|
||||
&Some(search_settings.safe_search_level),
|
||||
¶ms.safesearch,
|
||||
params.safesearch,
|
||||
search_settings.safe_search_level,
|
||||
config.safe_search,
|
||||
);
|
||||
|
||||
@ -227,12 +227,12 @@ async fn results(
|
||||
search_results
|
||||
}
|
||||
};
|
||||
if results.engine_errors_info().is_empty()
|
||||
&& results.results().is_empty()
|
||||
&& !results.no_engines_selected()
|
||||
{
|
||||
results.set_filtered();
|
||||
}
|
||||
let (engine_errors_info, results_empty_check, no_engines_selected) = (
|
||||
results.engine_errors_info().is_empty(),
|
||||
results.results().is_empty(),
|
||||
results.no_engines_selected(),
|
||||
);
|
||||
results.set_filtered(engine_errors_info & results_empty_check & !no_engines_selected);
|
||||
cache
|
||||
.cache_results(&[results.clone()], &[cache_key.clone()])
|
||||
.await?;
|
||||
@ -269,24 +269,29 @@ fn is_match_from_filter_list(
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
/// A helper function to modify the safe search level based on the url params.
|
||||
/// The `safe_search` is the one in the user's cookie or
|
||||
/// the default set by the server config if the cookie was missing.
|
||||
/// A helper function to choose the safe search level value based on the URL parameters,
|
||||
/// cookie value and config value.
|
||||
///
|
||||
/// # Argurments
|
||||
///
|
||||
/// * `url_level` - Safe search level from the url.
|
||||
/// * `safe_search` - User's cookie, or the safe search level set by the server
|
||||
/// * `config_level` - Safe search level to fall back to
|
||||
fn get_safesearch_level(cookie_level: &Option<u8>, url_level: &Option<u8>, config_level: u8) -> u8 {
|
||||
match url_level {
|
||||
Some(url_level) => {
|
||||
if *url_level >= 3 {
|
||||
config_level
|
||||
} else {
|
||||
*url_level
|
||||
}
|
||||
}
|
||||
None => cookie_level.unwrap_or(config_level),
|
||||
}
|
||||
/// * `safe_search_level_from_url` - Safe search level from the URL parameters.
|
||||
/// * `cookie_safe_search_level` - Safe search level value from the cookie.
|
||||
/// * `config_safe_search_level` - Safe search level value from the config file.
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// Returns an appropriate safe search level value based on the safe search level values
|
||||
/// from the URL parameters, cookie and the config file.
|
||||
fn get_safesearch_level(
|
||||
safe_search_level_from_url: Option<u8>,
|
||||
cookie_safe_search_level: u8,
|
||||
config_safe_search_level: u8,
|
||||
) -> 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)))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user