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"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"criterion",
|
||||||
"hashbrown",
|
"hashbrown",
|
||||||
"quickcheck",
|
"quickcheck",
|
||||||
"quickcheck_macros",
|
"quickcheck_macros",
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ pub fn run_handshakes_and_read_messages(
|
||||||
|
|
||||||
match established_ws.ws.read_message(){
|
match established_ws.ws.read_message(){
|
||||||
Ok(ws_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 naive_peer_addr = established_ws.peer_addr;
|
||||||
let converted_peer_ip = convert_ipv4_mapped_ipv6(
|
let converted_peer_ip = convert_ipv4_mapped_ipv6(
|
||||||
naive_peer_addr.ip()
|
naive_peer_addr.ip()
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ license = "Apache-2.0"
|
||||||
[lib]
|
[lib]
|
||||||
name = "aquatic_ws_protocol"
|
name = "aquatic_ws_protocol"
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "bench_deserialize_announce_request"
|
||||||
|
path = "benches/bench_deserialize_announce_request.rs"
|
||||||
|
harness = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
hashbrown = { version = "0.8", features = ["serde"] }
|
hashbrown = { version = "0.8", features = ["serde"] }
|
||||||
|
|
@ -16,5 +21,6 @@ serde_json = "1"
|
||||||
tungstenite = "0.11"
|
tungstenite = "0.11"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
criterion = "0.3"
|
||||||
quickcheck = "0.9"
|
quickcheck = "0.9"
|
||||||
quickcheck_macros = "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 {
|
impl InMessage {
|
||||||
#[inline]
|
#[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};
|
use tungstenite::Message::{Text, Binary};
|
||||||
|
|
||||||
let text = match ws_message {
|
let text = match ws_message {
|
||||||
Text(text) => text,
|
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")),
|
_ => 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 {
|
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 {
|
fn quickcheck_serde_identity_in_message(in_message_1: InMessage) -> bool {
|
||||||
let ws_message = in_message_1.to_ws_message();
|
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;
|
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