mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 09:45:31 +00:00
aquatic_ws: add bench for InMessage::from_ws_message, take ws msg by ref
This commit is contained in:
parent
74a538963f
commit
99724c7e5d
11 changed files with 1091 additions and 5 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -240,6 +240,7 @@ name = "aquatic_ws_protocol"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"criterion",
|
||||
"hashbrown",
|
||||
"quickcheck",
|
||||
"quickcheck_macros",
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ pub fn run_handshakes_and_read_messages(
|
|||
|
||||
match established_ws.ws.read_message(){
|
||||
Ok(ws_message) => {
|
||||
if let Ok(in_message) = InMessage::from_ws_message(ws_message){
|
||||
if let Ok(in_message) = InMessage::from_ws_message(&ws_message){
|
||||
let naive_peer_addr = established_ws.peer_addr;
|
||||
let converted_peer_ip = convert_ipv4_mapped_ipv6(
|
||||
naive_peer_addr.ip()
|
||||
|
|
|
|||
|
|
@ -8,6 +8,11 @@ license = "Apache-2.0"
|
|||
[lib]
|
||||
name = "aquatic_ws_protocol"
|
||||
|
||||
[[bench]]
|
||||
name = "bench_deserialize_announce_request"
|
||||
path = "benches/bench_deserialize_announce_request.rs"
|
||||
harness = false
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1"
|
||||
hashbrown = { version = "0.8", features = ["serde"] }
|
||||
|
|
@ -16,5 +21,6 @@ serde_json = "1"
|
|||
tungstenite = "0.11"
|
||||
|
||||
[dev-dependencies]
|
||||
criterion = "0.3"
|
||||
quickcheck = "0.9"
|
||||
quickcheck_macros = "0.9"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
use std::time::Duration;
|
||||
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
||||
|
||||
use aquatic_ws_protocol::*;
|
||||
|
||||
|
||||
pub fn bench(c: &mut Criterion) {
|
||||
let info_hash = InfoHash([
|
||||
b'a', b'b', b'c', b'd', b'e',
|
||||
b'?', b'\n', b'1', b'2', b'3',
|
||||
0, 1, 2, 3, 4,
|
||||
0, 1, 2, 3, 4,
|
||||
]);
|
||||
let peer_id = PeerId(info_hash.0);
|
||||
let offers: Vec<AnnounceRequestOffer> = (0..10).map(|i| {
|
||||
let mut offer_id = OfferId(info_hash.0);
|
||||
|
||||
offer_id.0[i] = i as u8;
|
||||
|
||||
AnnounceRequestOffer {
|
||||
offer: JsonValue(::serde_json::json!({ "sdp": "abcdef" })),
|
||||
offer_id,
|
||||
}
|
||||
}).collect();
|
||||
let offers_len = offers.len();
|
||||
|
||||
let request = InMessage::AnnounceRequest(AnnounceRequest {
|
||||
action: AnnounceAction,
|
||||
info_hash,
|
||||
peer_id,
|
||||
bytes_left: Some(2),
|
||||
event: Some(AnnounceEvent::Started),
|
||||
offers: Some(offers),
|
||||
numwant: Some(offers_len),
|
||||
answer: Some(JsonValue(::serde_json::json!({ "sdp": "abcdef" }))),
|
||||
to_peer_id: Some(peer_id),
|
||||
offer_id: Some(OfferId(info_hash.0))
|
||||
});
|
||||
|
||||
let ws_message = request.to_ws_message();
|
||||
|
||||
c.bench_function("deserialize-announce-request", |b| b.iter(||
|
||||
InMessage::from_ws_message(black_box(&ws_message))
|
||||
));
|
||||
}
|
||||
|
||||
criterion_group!{
|
||||
name = benches;
|
||||
config = Criterion::default()
|
||||
.sample_size(1000)
|
||||
.measurement_time(Duration::from_secs(180))
|
||||
.significance_level(0.01);
|
||||
targets = bench
|
||||
}
|
||||
criterion_main!(benches);
|
||||
|
|
@ -258,16 +258,16 @@ pub enum InMessage {
|
|||
|
||||
impl InMessage {
|
||||
#[inline]
|
||||
pub fn from_ws_message(ws_message: tungstenite::Message) -> ::anyhow::Result<Self> {
|
||||
pub fn from_ws_message(ws_message: &tungstenite::Message) -> ::anyhow::Result<Self> {
|
||||
use tungstenite::Message::{Text, Binary};
|
||||
|
||||
let text = match ws_message {
|
||||
Text(text) => text,
|
||||
Binary(bytes) => String::from_utf8(bytes)?,
|
||||
Binary(bytes) => ::std::str::from_utf8(bytes)?,
|
||||
_ => return Err(anyhow::anyhow!("Message is neither text nor bytes")),
|
||||
};
|
||||
|
||||
::serde_json::from_str(&text).context("serialize with serde")
|
||||
::serde_json::from_str(text).context("serialize with serde")
|
||||
}
|
||||
|
||||
pub fn to_ws_message(&self) -> ::tungstenite::Message {
|
||||
|
|
@ -523,7 +523,7 @@ mod tests {
|
|||
fn quickcheck_serde_identity_in_message(in_message_1: InMessage) -> bool {
|
||||
let ws_message = in_message_1.to_ws_message();
|
||||
|
||||
let in_message_2 = InMessage::from_ws_message(ws_message.clone()).unwrap();
|
||||
let in_message_2 = InMessage::from_ws_message(&ws_message).unwrap();
|
||||
|
||||
let success = in_message_1 == in_message_2;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
{"group_id":"deserialize-announce-request","function_id":null,"value_str":null,"throughput":null,"full_id":"deserialize-announce-request","directory_name":"deserialize-announce-request","title":"deserialize-announce-request"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":18703.904042751496,"upper_bound":18792.03205243071},"point_estimate":18746.072800173675,"standard_error":22.574908262590952},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":18547.912025316455,"upper_bound":18605.846380105744},"point_estimate":18576.281397429004,"standard_error":15.686062550253332},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":306.28255537969375,"upper_bound":380.480602345445},"point_estimate":338.0236020241898,"standard_error":19.790518378924638},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":18658.020869749234,"upper_bound":18761.405070764362},"point_estimate":18706.576690779686,"standard_error":26.604673332450176},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":553.3799052716993,"upper_bound":868.3032654487926},"point_estimate":715.2362082741504,"standard_error":80.39906836878366}}
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
[16630.874818319186,17501.98981446029,19824.96313750323,20696.078133644332]
|
||||
19
scripts/criterion/aquatic-ws-deserialize-announce-request.sh
Executable file
19
scripts/criterion/aquatic-ws-deserialize-announce-request.sh
Executable file
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
# Run benchmark, comparing against previous result.
|
||||
|
||||
set -e
|
||||
|
||||
export RUSTFLAGS="-C target-cpu=native"
|
||||
|
||||
cargo bench --bench bench_deserialize_announce_request -- --noplot --baseline latest
|
||||
|
||||
read -p "Replace previous benchmark result with this one (y/N)? " answer
|
||||
|
||||
case ${answer:0:1} in
|
||||
y|Y )
|
||||
cd aquatic_ws_protocol/target/criterion/deserialize-announce-request/ &&
|
||||
rm -r latest &&
|
||||
mv new latest &&
|
||||
echo "Replaced previous benchmark"
|
||||
;;
|
||||
esac
|
||||
Loading…
Add table
Add a link
Reference in a new issue