Advertisement
Guest User

benchmarking

a guest
Oct 16th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.71 KB | None | 0 0
  1. use criterion::*;
  2.  
  3. const T: [u8; 64] = [
  4.     b'A', b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P',
  5.     b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y', b'Z', b'a', b'b', b'c', b'd', b'e', b'f',
  6.     b'g', b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o', b'p', b'q', b'r', b's', b't', b'u', b'v',
  7.     b'w', b'x', b'y', b'z', b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'+', b'/',
  8. ];
  9.  
  10. fn b64_encode1a(xs: &[u8]) -> Vec<u8> {
  11.     let mut ix = 0;
  12.     let mut out = vec![0; (xs.len() + 2) / 3 * 4];
  13.     for ys in xs.chunks_exact(3) {
  14.         out[ix] = T[(ys[0] >> 2 & 0x3f) as usize];
  15.         out[ix + 1] = T[(ys[0] << 4 & 0x30 | ys[1] >> 4 & 0x0f) as usize];
  16.         out[ix + 2] = T[(ys[1] << 2 & 0x3c | ys[2] >> 6 & 0x03) as usize];
  17.         out[ix + 3] = T[(ys[2] & 0x3f) as usize];
  18.         ix += 4;
  19.     }
  20.     out
  21. }
  22.  
  23. fn b64_encode1b(xs: &[u8]) -> Vec<u8> {
  24.     let mut ix = 0;
  25.     let mut out = vec![0; (xs.len() + 2) / 3 * 4];
  26.     let mut it6 = xs.chunks_exact(6);
  27.     for ys in &mut it6 {
  28.         out[ix] = T[(ys[0] >> 2 & 0x3f) as usize];
  29.         out[ix + 1] = T[(ys[0] << 4 & 0x30 | ys[1] >> 4 & 0x0f) as usize];
  30.         out[ix + 2] = T[(ys[1] << 2 & 0x3c | ys[2] >> 6 & 0x03) as usize];
  31.         out[ix + 3] = T[(ys[2] & 0x3f) as usize];
  32.         out[ix + 4] = T[(ys[3] >> 2 & 0x3f) as usize];
  33.         out[ix + 5] = T[(ys[3] << 4 & 0x30 | ys[4] >> 4 & 0x0f) as usize];
  34.         out[ix + 6] = T[(ys[4] << 2 & 0x3c | ys[5] >> 6 & 0x03) as usize];
  35.         out[ix + 7] = T[(ys[5] & 0x3f) as usize];
  36.         ix += 8;
  37.     }
  38.     for ys in it6.remainder().chunks_exact(3) {
  39.         out[ix] = T[(ys[0] >> 2 & 0x3f) as usize];
  40.         out[ix + 1] = T[(ys[0] << 4 & 0x30 | ys[1] >> 4 & 0x0f) as usize];
  41.         out[ix + 2] = T[(ys[1] << 2 & 0x3c | ys[2] >> 6 & 0x03) as usize];
  42.         out[ix + 3] = T[(ys[2] & 0x3f) as usize];
  43.         ix += 4;
  44.     }
  45.     out
  46. }
  47.  
  48. fn b64_encode1c(xs: &[u8]) -> Vec<u8> {
  49.     let mut ix = 0;
  50.     let mut out = vec![0; (xs.len() + 2) / 3 * 4];
  51.     let mut it12 = xs.chunks_exact(12);
  52.     for ys in &mut it12 {
  53.         out[ix] = T[(ys[0] >> 2 & 0x3f) as usize];
  54.         out[ix + 1] = T[(ys[0] << 4 & 0x30 | ys[1] >> 4 & 0x0f) as usize];
  55.         out[ix + 2] = T[(ys[1] << 2 & 0x3c | ys[2] >> 6 & 0x03) as usize];
  56.         out[ix + 3] = T[(ys[2] & 0x3f) as usize];
  57.         out[ix + 4] = T[(ys[3] >> 2 & 0x3f) as usize];
  58.         out[ix + 5] = T[(ys[3] << 4 & 0x30 | ys[4] >> 4 & 0x0f) as usize];
  59.         out[ix + 6] = T[(ys[4] << 2 & 0x3c | ys[5] >> 6 & 0x03) as usize];
  60.         out[ix + 7] = T[(ys[5] & 0x3f) as usize];
  61.         out[ix + 8] = T[(ys[6] >> 2 & 0x3f) as usize];
  62.         out[ix + 9] = T[(ys[6] << 4 & 0x30 | ys[7] >> 4 & 0x0f) as usize];
  63.         out[ix + 10] = T[(ys[7] << 2 & 0x3c | ys[8] >> 6 & 0x03) as usize];
  64.         out[ix + 11] = T[(ys[8] & 0x3f) as usize];
  65.         out[ix + 12] = T[(ys[9] >> 2 & 0x3f) as usize];
  66.         out[ix + 13] = T[(ys[9] << 4 & 0x30 | ys[10] >> 4 & 0x0f) as usize];
  67.         out[ix + 14] = T[(ys[10] << 2 & 0x3c | ys[11] >> 6 & 0x03) as usize];
  68.         out[ix + 15] = T[(ys[11] & 0x3f) as usize];
  69.         ix += 16;
  70.     }
  71.     for ys in it12.remainder().chunks_exact(3) {
  72.         out[ix] = T[(ys[0] >> 2 & 0x3f) as usize];
  73.         out[ix + 1] = T[(ys[0] << 4 & 0x30 | ys[1] >> 4 & 0x0f) as usize];
  74.         out[ix + 2] = T[(ys[1] << 2 & 0x3c | ys[2] >> 6 & 0x03) as usize];
  75.         out[ix + 3] = T[(ys[2] & 0x3f) as usize];
  76.         ix += 4;
  77.     }
  78.     out
  79. }
  80.  
  81. fn b64_encode2a(xs: &[u8]) -> Vec<u8> {
  82.     let mut ix = 0;
  83.     let mut out = vec![0; (xs.len() + 2) / 3 * 4];
  84.     for jx in (0..xs.len() / 3 * 3).step_by(3) {
  85.         out[ix] = T[(xs[jx] >> 2 & 0x3f) as usize];
  86.         out[ix + 1] = T[(xs[jx] << 4 & 0x30 | xs[jx + 1] >> 4 & 0x0f) as usize];
  87.         out[ix + 2] = T[(xs[jx + 1] << 2 & 0x3c | xs[jx + 2] >> 6 & 0x03) as usize];
  88.         out[ix + 3] = T[(xs[jx + 2] & 0x3f) as usize];
  89.         ix += 4;
  90.     }
  91.     out
  92. }
  93.  
  94. fn b64_encode2b(xs: &[u8]) -> Vec<u8> {
  95.     let mut ix = 0;
  96.     let mut out = vec![0; (xs.len() + 2) / 3 * 4];
  97.  
  98.     for jx in (0..xs.len() / 6 * 6).step_by(6) {
  99.         out[ix] = T[(xs[jx] >> 2 & 0x3f) as usize];
  100.         out[ix + 1] = T[(xs[jx] << 4 & 0x30 | xs[jx + 1] >> 4 & 0x0f) as usize];
  101.         out[ix + 2] = T[(xs[jx + 1] << 2 & 0x3c | xs[jx + 2] >> 6 & 0x03) as usize];
  102.         out[ix + 3] = T[(xs[jx + 2] & 0x3f) as usize];
  103.         out[ix + 4] = T[(xs[jx + 3] >> 2 & 0x3f) as usize];
  104.         out[ix + 5] = T[(xs[jx + 3] << 4 & 0x30 | xs[jx + 4] >> 4 & 0x0f) as usize];
  105.         out[ix + 6] = T[(xs[jx + 4] << 2 & 0x3c | xs[jx + 5] >> 6 & 0x03) as usize];
  106.         out[ix + 7] = T[(xs[jx + 5] & 0x3f) as usize];
  107.         ix += 8;
  108.     }
  109.  
  110.     for jx in (xs.len() / 6 * 6..xs.len() / 3 * 3).step_by(3) {
  111.         out[ix] = T[(xs[jx] >> 2 & 0x3f) as usize];
  112.         out[ix + 1] = T[(xs[jx] << 4 & 0x30 | xs[jx + 1] >> 4 & 0x0f) as usize];
  113.         out[ix + 2] = T[(xs[jx + 1] << 2 & 0x3c | xs[jx + 2] >> 6 & 0x03) as usize];
  114.         out[ix + 3] = T[(xs[jx + 2] & 0x3f) as usize];
  115.         ix += 4;
  116.     }
  117.     out
  118. }
  119.  
  120. fn bench(c: &mut Criterion) {
  121.     let v = (0..128 * 1024).map(|x| x as u8).collect::<Vec<u8>>();
  122.  
  123.     let mut group = c.benchmark_group("b64");
  124.     group.throughput(Throughput::Bytes(v.len() as u64));
  125.     group.bench_function("b64_encode1a", |b| b.iter(|| b64_encode1a(&v)));
  126.     group.bench_function("b64_encode1b", |b| b.iter(|| b64_encode1b(&v)));
  127.     group.bench_function("b64_encode1c", |b| b.iter(|| b64_encode1c(&v)));
  128.     group.bench_function("b64_encode2a", |b| b.iter(|| b64_encode2a(&v)));
  129.     group.bench_function("b64_encode2b", |b| b.iter(|| b64_encode2b(&v)));
  130.     group.finish();
  131. }
  132.  
  133. criterion_group!(benches, bench);
  134. criterion_main!(benches);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement