diff --git a/Cargo.toml b/Cargo.toml
index c446fa4962e2a4ec0a69e571f007c976fd45efee..bf76cdf244fb13bb2f1869e47df318f84f22aec8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,6 +20,7 @@ tracing = "0.1.40"
 tracing-subscriber = "0.3.17"
 
 [dev-dependencies]
+ark-poly-commit = "0.4.0"
 criterion = "0.3"
 
 [[bench]]
@@ -33,3 +34,7 @@ harness = false
 [[bench]]
 name = "setup"
 harness = false
+
+[[bench]]
+name = "commit"
+harness = false
diff --git a/benches/commit.rs b/benches/commit.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e3594da9a3d5f239936072f72cbce2e831054d80
--- /dev/null
+++ b/benches/commit.rs
@@ -0,0 +1,82 @@
+use ark_bls12_381::{Bls12_381, Fr, G1Projective};
+use ark_ec::{pairing::Pairing, CurveGroup};
+use ark_ff::PrimeField;
+use ark_poly::{univariate::DensePolynomial, DenseUVPolynomial};
+use ark_std::{ops::Div, test_rng};
+
+use ark_poly_commit::kzg10::{Powers, KZG10};
+
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use komodo::zk;
+
+fn commit_template<F, G, P>(c: &mut Criterion, nb_bytes: usize)
+where
+    F: PrimeField,
+    G: CurveGroup<ScalarField = F>,
+    P: DenseUVPolynomial<F>,
+    for<'a, 'b> &'a P: Div<&'b P, Output = P>,
+{
+    let rng = &mut test_rng();
+
+    let degree = zk::nb_elements_in_setup::<F>(nb_bytes);
+
+    let setup = zk::setup::<_, F, G>(degree, rng).unwrap();
+    let polynomial = P::rand(degree, rng);
+
+    c.bench_function(
+        &format!(
+            "commit {} bytes on {}",
+            nb_bytes,
+            std::any::type_name::<F>()
+        ),
+        |b| b.iter(|| zk::commit(&setup, &polynomial)),
+    );
+}
+
+fn ark_commit_template<E, P>(c: &mut Criterion, nb_bytes: usize)
+where
+    E: Pairing,
+    P: DenseUVPolynomial<E::ScalarField>,
+    for<'a, 'b> &'a P: Div<&'b P, Output = P>,
+{
+    let rng = &mut test_rng();
+
+    let degree = zk::nb_elements_in_setup::<E::ScalarField>(nb_bytes);
+
+    let setup = KZG10::<E, P>::setup(degree, false, rng).unwrap();
+    let powers_of_g = setup.powers_of_g[..=degree].to_vec();
+    let powers_of_gamma_g = (0..=degree).map(|i| setup.powers_of_gamma_g[&i]).collect();
+    let powers = Powers::<E> {
+        powers_of_g: ark_std::borrow::Cow::Owned(powers_of_g),
+        powers_of_gamma_g: ark_std::borrow::Cow::Owned(powers_of_gamma_g),
+    };
+    let polynomial = P::rand(degree, rng);
+
+    c.bench_function(
+        &format!(
+            "commit (arkworks) {} bytes on {}",
+            nb_bytes,
+            std::any::type_name::<E>()
+        ),
+        |b| b.iter(|| KZG10::commit(&powers, &polynomial, None, None)),
+    );
+}
+
+fn commit(c: &mut Criterion) {
+    for n in [1, 2, 4, 8, 16] {
+        commit_template::<Fr, G1Projective, DensePolynomial<Fr>>(c, black_box(n * 1024));
+    }
+}
+
+fn ark_commit(c: &mut Criterion) {
+    for n in [1, 2, 4, 8, 16] {
+        ark_commit_template::<Bls12_381, DensePolynomial<<Bls12_381 as Pairing>::ScalarField>>(
+            c,
+            black_box(n * 1024),
+        );
+    }
+}
+
+criterion_group!(benches, commit, ark_commit);
+criterion_main!(benches);
diff --git a/benches/setup.rs b/benches/setup.rs
index 5ca6b63d0b20d57ce10fa9ad22563292f3b0173d..5ef5d0eb507eb7ad72f104e814bad53157b19fb9 100644
--- a/benches/setup.rs
+++ b/benches/setup.rs
@@ -1,7 +1,8 @@
-use ark_bls12_381::{Fr, G1Projective};
-use ark_ec::CurveGroup;
+use ark_bls12_381::{Bls12_381, Fr, G1Projective};
+use ark_ec::{pairing::Pairing, CurveGroup};
 use ark_ff::PrimeField;
 use ark_poly::{univariate::DensePolynomial, DenseUVPolynomial};
+use ark_poly_commit::kzg10::{self, KZG10};
 use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate};
 use ark_std::{ops::Div, test_rng};
 
@@ -20,9 +21,11 @@ where
 
     let rng = &mut test_rng();
 
+    let degree = zk::nb_elements_in_setup::<F>(nb_bytes);
+
     group.bench_function(
         &format!("setup {} on {}", nb_bytes, std::any::type_name::<F>()),
-        |b| b.iter(|| zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(nb_bytes), rng).unwrap()),
+        |b| b.iter(|| zk::setup::<_, F, G>(degree, rng).unwrap()),
     );
 
     let setup = zk::setup::<_, F, G>(zk::nb_elements_in_setup::<F>(nb_bytes), rng).unwrap();
@@ -114,11 +117,50 @@ where
     group.finish();
 }
 
+fn ark_setup_template<E, P>(c: &mut Criterion, nb_bytes: usize)
+where
+    E: Pairing,
+    P: DenseUVPolynomial<E::ScalarField>,
+    for<'a, 'b> &'a P: Div<&'b P, Output = P>,
+{
+    let rng = &mut test_rng();
+
+    let degree = zk::nb_elements_in_setup::<E::ScalarField>(nb_bytes);
+
+    c.bench_function(
+        &format!(
+            "setup (arkworks) {} bytes on {}",
+            nb_bytes,
+            std::any::type_name::<E>()
+        ),
+        |b| {
+            b.iter(|| {
+                let setup = KZG10::<E, P>::setup(degree, false, rng).unwrap();
+                let powers_of_g = setup.powers_of_g[..=degree].to_vec();
+                let powers_of_gamma_g = (0..=degree).map(|i| setup.powers_of_gamma_g[&i]).collect();
+                kzg10::Powers::<E> {
+                    powers_of_g: ark_std::borrow::Cow::Owned(powers_of_g),
+                    powers_of_gamma_g: ark_std::borrow::Cow::Owned(powers_of_gamma_g),
+                }
+            })
+        },
+    );
+}
+
 fn setup(c: &mut Criterion) {
     for n in [1, 2, 4, 8, 16] {
         setup_template::<Fr, G1Projective, DensePolynomial<Fr>>(c, black_box(n * 1024));
     }
 }
 
-criterion_group!(benches, setup);
+fn ark_setup(c: &mut Criterion) {
+    for n in [1, 2, 4, 8, 16] {
+        ark_setup_template::<Bls12_381, DensePolynomial<<Bls12_381 as Pairing>::ScalarField>>(
+            c,
+            black_box(n * 1024),
+        );
+    }
+}
+
+criterion_group!(benches, setup, ark_setup);
 criterion_main!(benches);