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:
parent
5f0edde549
commit
c83863608a
@ -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
|
||||||
|
@ -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}",
|
||||||
|
@ -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`.
|
||||||
|
@ -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,
|
||||||
¶ms.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)))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user