/ fields / benches / fields.rs
fields.rs
  1  // Copyright (c) 2019-2025 Alpha-Delta Network Inc.
  2  // This file is part of the deltavm library.
  3  
  4  // Licensed under the Apache License, Version 2.0 (the "License");
  5  // you may not use this file except in compliance with the License.
  6  // You may obtain a copy of the License at:
  7  
  8  // http://www.apache.org/licenses/LICENSE-2.0
  9  
 10  // Unless required by applicable law or agreed to in writing, software
 11  // distributed under the License is distributed on an "AS IS" BASIS,
 12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  // See the License for the specific language governing permissions and
 14  // limitations under the License.
 15  
 16  // Silences the false positives caused by black_box.
 17  #![allow(clippy::unit_arg)]
 18  
 19  use deltavm_fields::{Field, Fp256, Fp384, PrimeField};
 20  use deltavm_utilities::TestRng;
 21  
 22  use criterion::*;
 23  use rand::Rng;
 24  use std::{
 25      hint::black_box,
 26      ops::{AddAssign, MulAssign, SubAssign},
 27  };
 28  
 29  fn fp256(c: &mut Criterion) {
 30      let rng = &mut TestRng::default();
 31  
 32      const N: usize = 1_000;
 33  
 34      let mut values = Vec::with_capacity(N);
 35      let mut arr = [0u8; 32];
 36  
 37      while values.len() < N {
 38          rng.fill(&mut arr);
 39          if let Some(v) = Fp256::<deltavm_curves::bls12_377::FrParameters>::from_random_bytes(&arr) {
 40              values.push(v);
 41          }
 42      }
 43  
 44      c.bench_function("fp256_add_assign", |b| {
 45          b.iter(|| {
 46              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
 47                  black_box(v1.add_assign(v2));
 48              }
 49          })
 50      });
 51  
 52      c.bench_function("fp256_sub_assign", |b| {
 53          b.iter(|| {
 54              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
 55                  black_box(v1.sub_assign(v2));
 56              }
 57          })
 58      });
 59  
 60      c.bench_function("fp256_mul_assign", |b| {
 61          b.iter(|| {
 62              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
 63                  black_box(v1.mul_assign(v2));
 64              }
 65          })
 66      });
 67  
 68      c.bench_function("fp256_inverse", |b| {
 69          b.iter(|| {
 70              for v in values.iter() {
 71                  black_box(v.inverse());
 72              }
 73          })
 74      });
 75  
 76      c.bench_function("fp256_square_in_place", |b| {
 77          b.iter(|| {
 78              for mut v in values.iter().cloned() {
 79                  black_box(v.square_in_place());
 80              }
 81          })
 82      });
 83  
 84      c.bench_function("fp256_to_bigint", |b| {
 85          b.iter(|| {
 86              for v in values.iter() {
 87                  black_box(v.to_bigint());
 88              }
 89          })
 90      });
 91  }
 92  
 93  fn fp384(c: &mut Criterion) {
 94      let rng = &mut TestRng::default();
 95  
 96      const N: usize = 1_000;
 97  
 98      let mut values = Vec::with_capacity(N);
 99      let mut arr = [0u8; 48];
100  
101      while values.len() < N {
102          rng.fill(&mut arr[..32]);
103          rng.fill(&mut arr[32..]);
104          if let Some(v) = Fp384::<deltavm_curves::bls12_377::FqParameters>::from_random_bytes(&arr) {
105              values.push(v);
106          }
107      }
108  
109      c.bench_function("fp384_add_assign", |b| {
110          b.iter(|| {
111              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
112                  black_box(v1.add_assign(v2));
113              }
114          })
115      });
116  
117      c.bench_function("fp384_sub_assign", |b| {
118          b.iter(|| {
119              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
120                  black_box(v1.sub_assign(v2));
121              }
122          })
123      });
124  
125      c.bench_function("fp384_mul_assign", |b| {
126          b.iter(|| {
127              for (mut v1, v2) in values.iter().cloned().zip(values.iter().skip(1)) {
128                  black_box(v1.mul_assign(v2));
129              }
130          })
131      });
132  
133      c.bench_function("fp384_inverse", |b| {
134          b.iter(|| {
135              for v in values.iter() {
136                  black_box(v.inverse());
137              }
138          })
139      });
140  
141      c.bench_function("fp384_square_in_place", |b| {
142          b.iter(|| {
143              for mut v in values.iter().cloned() {
144                  black_box(v.square_in_place());
145              }
146          })
147      });
148  
149      c.bench_function("fp384_to_bigint", |b| {
150          b.iter(|| {
151              for v in values.iter() {
152                  black_box(v.to_bigint());
153              }
154          })
155      });
156  }
157  
158  criterion_group! {
159      name = fields;
160      config = Criterion::default();
161      targets = fp256, fp384
162  }
163  
164  criterion_main!(fields);