Skip to content

Commit c74d16a

Browse files
committed
README.md added
1 parent f364316 commit c74d16a

File tree

6 files changed

+105
-12
lines changed

6 files changed

+105
-12
lines changed

benches/README.md

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
3+
# Benchmarking the 2 performance critical functions DaqEvent::trigger and CalSeg::sync
4+
5+
## DaqEvent::trigger
6+
7+
memcpy versus this:
8+
9+
'''
10+
if (n==8) {
11+
*(uint64_t*)d = *(uint64_t*)&base[OdtEntryAddr(e)];
12+
d += 8;
13+
}
14+
else if (n==4) {
15+
*(uint32_t*)d = *(uint32_t*)&base[OdtEntryAddr(e)];
16+
d += 4;
17+
}
18+
else if (n<4) {
19+
uint8_t *s = &base[OdtEntryAddr(e)];
20+
do { *d++ = *s++; } while (--n);
21+
}
22+
else
23+
{
24+
memcpy((uint8_t*)d, &base[OdtEntryAddr(e)], n);
25+
d += n;
26+
}
27+
e++;
28+
'''
29+
30+
31+
![trigger bench](image.png)
32+
33+
34+
35+
## CalSeg::Sync
36+
37+
38+
![sync bench](image-1.png)

benches/image-1.png

51.4 KB
Loading

benches/image.png

56.7 KB
Loading

benches/xcp_benchmark.rs

+50-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1-
use criterion::{criterion_group, criterion_main, Criterion};
1+
// cargo bench -- --save-baseline parking_lot
2+
// cargo bench -- --baseline parking_lot
3+
// cargo bench -- --save-baseline parking_lot
4+
// cargo bench -- --load-baseline new --baseline parking_lot
5+
// --warm-up-time 0
6+
// --nresamples <nresamples>
7+
//
8+
//
9+
10+
#![allow(unused_assignments)]
11+
#![allow(unused_imports)]
212

3-
#[allow(unused_imports)]
413
use log::{debug, error, info, trace, warn};
14+
515
use std::{
616
fmt::Debug,
717
sync::{Arc, Mutex},
@@ -11,10 +21,10 @@ use std::{
1121

1222
use serde::{Deserialize, Serialize};
1323
use xcp::*;
14-
use xcp_type_description::prelude::*;
15-
1624
use xcp_client::xcp_client::*;
25+
use xcp_type_description::prelude::*;
1726

27+
use criterion::{criterion_group, criterion_main, Criterion};
1828
//-----------------------------------------------------------------------------
1929
// Calibration parameters
2030

@@ -112,8 +122,15 @@ async fn xcp_client(dest_addr: std::net::SocketAddr, local_addr: std::net::Socke
112122
match current_mode {
113123
ClientMode::Measure => {
114124
info!("Start Measurement");
115-
// Measurement of signal
116-
xcp_client.create_measurement_object("signal").expect("measurmeent signal not found");
125+
// Measurement signals
126+
xcp_client.create_measurement_object("signal1").expect("measurement signal not found");
127+
xcp_client.create_measurement_object("signal2").expect("measurement signal not found");
128+
xcp_client.create_measurement_object("signal3").expect("measurement signal not found");
129+
xcp_client.create_measurement_object("signal4").expect("measurement signal not found");
130+
xcp_client.create_measurement_object("signal5").expect("measurement signal not found");
131+
xcp_client.create_measurement_object("signal6").expect("measurement signal not found");
132+
xcp_client.create_measurement_object("signal7").expect("measurement signal not found");
133+
xcp_client.create_measurement_object("signal8").expect("measurement signal not found");
117134
// Measure start
118135
xcp_client.start_measurement().await.expect("could not start measurement");
119136
}
@@ -209,11 +226,25 @@ fn xcp_benchmark(c: &mut Criterion) {
209226
let cal_page = xcp.create_calseg("CalPage", &CAL_PAGE, true);
210227

211228
// Measurement signal
212-
let mut signal: f64 = 0.0;
229+
let mut signal1: u32 = 0;
230+
let mut signal2: u64 = 0;
231+
let mut signal3: u8 = 0;
232+
let mut signal4: u16 = 0;
233+
let mut signal5: u64 = 0;
234+
let mut signal6: u32 = 0;
235+
let mut signal7: u16 = 0;
236+
let mut signal8: u64 = 0;
213237

214238
// Register a measurement event and bind it to the counter signal
215239
let event = daq_create_event!("mainloop");
216-
daq_register!(signal, event);
240+
daq_register!(signal1, event);
241+
daq_register!(signal2, event);
242+
daq_register!(signal3, event);
243+
daq_register!(signal4, event);
244+
daq_register!(signal5, event);
245+
daq_register!(signal6, event);
246+
daq_register!(signal7, event);
247+
daq_register!(signal8, event);
217248

218249
// Wait a moment
219250
thread::sleep(Duration::from_millis(100));
@@ -247,17 +278,26 @@ fn xcp_benchmark(c: &mut Criterion) {
247278
thread::sleep(Duration::from_millis(100));
248279

249280
// Bench measurement trigger
281+
signal1 += 1;
282+
signal2 += 1;
283+
signal3 += 1;
284+
signal4 += 1;
285+
signal5 += 1;
286+
signal6 += 1;
287+
signal7 += 1;
288+
signal8 += 1;
250289
info!("Start measurement bench");
290+
let mut count: u32 = 0;
251291
*mode.lock() = ClientMode::Measure;
252292
c.bench_function("trigger", |b| {
253293
b.iter(|| {
254-
signal += 1.0;
294+
count += 1;
255295
event.trigger()
256296
})
257297
});
258298
*mode.lock() = ClientMode::Wait;
259299
thread::sleep(Duration::from_millis(100));
260-
info!("Measurement bench done, count = {}", signal);
300+
info!("Measurement bench done, count = {}", count);
261301

262302
// Wait a moment
263303
thread::sleep(Duration::from_millis(100));

xcplib/src/xcpLite.c

+16-1
Original file line numberDiff line numberDiff line change
@@ -893,9 +893,24 @@ static void XcpTriggerDaq(uint16_t daq, const uint8_t* base, uint64_t clock) {
893893
#ifdef XCP_ENABLE_PACKED_MODE
894894
if (sc>1) n *= sc; // packed mode
895895
#endif
896+
897+
if (n==8) {
898+
*(uint64_t*)d = *(uint64_t*)&base[OdtEntryAddr(e)];
899+
d += 8;
900+
}
901+
else if (n==4) {
902+
*(uint32_t*)d = *(uint32_t*)&base[OdtEntryAddr(e)];
903+
d += 4;
904+
}
905+
else if (n<4) {
906+
uint8_t *s = &base[OdtEntryAddr(e)];
907+
do { *d++ = *s++; } while (--n);
908+
} else
909+
{
896910
memcpy((uint8_t*)d, &base[OdtEntryAddr(e)], n);
897911
d += n;
898-
e++;
912+
}
913+
e++;
899914
} // ODT entry
900915
}
901916
// Dynamic length

xcplib/src/xcpTlQueue.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ const uint8_t * XcpTlTransmitQueuePeekMsg( uint16_t* msg_len ) {
297297
assert(entry1->dlc<=XCPTL_MAX_DTO_SIZE); // Max DTO size
298298

299299
if (gXcpTlQueue.overruns) { // Add the number of overruns
300-
DBG_PRINTF3("XcpTlTransmitQueuePeekMsg: overruns=%u\n", gXcpTlQueue.overruns);
300+
DBG_PRINTF4("XcpTlTransmitQueuePeekMsg: overruns=%u\n", gXcpTlQueue.overruns);
301301
gXcpTlQueue.ctr += gXcpTlQueue.overruns;
302302
gXcpTlQueue.overruns = 0;
303303
}

0 commit comments

Comments
 (0)