about summary refs log tree commit diff
path: root/tvix/glue/benches/eval.rs
blob: f5c9813c90638e80edffcbe4d72f4c1790e18c5a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use lazy_static::lazy_static;
use std::{cell::RefCell, env, rc::Rc, sync::Arc, time::Duration};
use tvix_castore::{
    blobservice::{BlobService, MemoryBlobService},
    directoryservice::{DirectoryService, MemoryDirectoryService},
};
use tvix_glue::{
    builtins::add_derivation_builtins, configure_nix_path, known_paths::KnownPaths,
    tvix_store_io::TvixStoreIO,
};
use tvix_store::pathinfoservice::{MemoryPathInfoService, PathInfoService};

lazy_static! {
    static ref BLOB_SERVICE: Arc<dyn BlobService> = Arc::new(MemoryBlobService::default());
    static ref DIRECTORY_SERVICE: Arc<dyn DirectoryService> =
        Arc::new(MemoryDirectoryService::default());
    static ref PATH_INFO_SERVICE: Arc<dyn PathInfoService> = Arc::new(MemoryPathInfoService::new(
        BLOB_SERVICE.clone(),
        DIRECTORY_SERVICE.clone(),
    ));
    static ref TOKIO_RUNTIME: tokio::runtime::Runtime = tokio::runtime::Runtime::new().unwrap();
}

fn interpret(code: &str) {
    // TODO: this is a bit annoying.
    // It'd be nice if we could set this up once and then run evaluate() with a
    // piece of code. b/262
    let mut eval = tvix_eval::Evaluation::new_impure();

    let known_paths: Rc<RefCell<KnownPaths>> = Default::default();
    add_derivation_builtins(&mut eval, known_paths);
    configure_nix_path(
        &mut eval,
        // The benchmark requires TVIX_BENCH_NIX_PATH to be set, so barf out
        // early, rather than benchmarking tvix returning an error.
        &Some(env::var("TVIX_BENCH_NIX_PATH").expect("TVIX_BENCH_NIX_PATH must be set")),
    );

    eval.io_handle = Box::new(tvix_glue::tvix_io::TvixIO::new(TvixStoreIO::new(
        BLOB_SERVICE.clone(),
        DIRECTORY_SERVICE.clone(),
        PATH_INFO_SERVICE.clone(),
        TOKIO_RUNTIME.handle().clone(),
    )));

    let result = eval.evaluate(code, None);

    assert!(result.errors.is_empty());
}

fn eval_nixpkgs(c: &mut Criterion) {
    c.bench_function("hello outpath", |b| {
        b.iter(|| {
            interpret(black_box("(import <nixpkgs> {}).hello.outPath"));
        })
    });
}

criterion_group!(
    name = benches;
    config = Criterion::default().measurement_time(Duration::from_secs(30)).sample_size(10);
    targets = eval_nixpkgs
);
criterion_main!(benches);