Remove layout-cache feature

This commit is contained in:
Laurenz 2022-02-18 17:33:13 +01:00
parent e01970b20a
commit 61d1e1a683
9 changed files with 14 additions and 160 deletions

47
Cargo.lock generated
View File

@ -581,12 +581,6 @@ dependencies = [
"miniz_oxide 0.4.4",
]
[[package]]
name = "ppv-lite86"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "proc-macro2"
version = "1.0.36"
@ -605,46 +599,6 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
"rand_hc",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
dependencies = [
"getrandom",
]
[[package]]
name = "rand_hc"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
dependencies = [
"rand_core",
]
[[package]]
name = "rctree"
version = "0.4.0"
@ -958,7 +912,6 @@ dependencies = [
"pdf-writer",
"pico-args",
"pixglyph",
"rand",
"resvg",
"roxmltree",
"rustybuzz",

View File

@ -5,10 +5,9 @@ authors = ["The Typst Project Developers"]
edition = "2021"
[features]
default = ["fs", "layout-cache"]
default = ["fs"]
cli = ["fs", "pico-args", "codespan-reporting", "same-file"]
fs = ["dirs", "memmap2", "same-file", "walkdir"]
layout-cache = []
# Dependency updates:
# - Bump ttf-parser when rustybuzz is updated
@ -64,9 +63,6 @@ dirs = { version = "4", optional = true }
memmap2 = { version = "0.5", optional = true }
walkdir = { version = "2", optional = true }
# Still here for layout cache evaluation, but must be activated manually.
rand = { version = "0.8", optional = true }
[dev-dependencies]
filedescriptor = "0.8"
iai = { git = "https://github.com/reknih/iai" }

View File

@ -1,6 +1,6 @@
use std::any::{Any, TypeId};
use std::fmt::{self, Debug, Formatter};
use std::hash::{Hash, Hasher};
use std::hash::Hash;
use std::sync::Arc;
use super::{StyleChain, Template};
@ -59,18 +59,12 @@ impl Debug for ShowNode {
impl PartialEq for ShowNode {
fn eq(&self, other: &Self) -> bool {
// We cast to thin pointers for comparison because we don't want to
// compare vtables (which can be different across codegen units).
std::ptr::eq(
Arc::as_ptr(&self.0) as *const (),
Arc::as_ptr(&other.0) as *const (),
)
self.0.eq(&other.0)
}
}
trait Bounds: Show + Debug + Sync + Send + 'static {
fn as_any(&self) -> &dyn Any;
fn hash64(&self) -> u64;
}
impl<T> Bounds for T
@ -80,19 +74,4 @@ where
fn as_any(&self) -> &dyn Any {
self
}
fn hash64(&self) -> u64 {
// Also hash the TypeId since nodes with different types but
// equal data should be different.
let mut state = fxhash::FxHasher64::default();
self.type_id().hash(&mut state);
self.hash(&mut state);
state.finish()
}
}
impl Hash for dyn Bounds {
fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u64(self.hash64());
}
}

View File

@ -11,8 +11,6 @@ use crate::geom::Scalar;
const TEMP_LEN: usize = 4;
/// Caches layouting artifacts.
///
/// _This is only available when the `layout-cache` feature is enabled._
#[derive(Default, Clone)]
pub struct LayoutCache {
/// Maps from node hashes to the resulting frames and regions in which the
@ -150,14 +148,6 @@ impl LayoutCache {
entries.retain(|f| f.hits() as f64 / f.age() as f64 > threshold);
}
}
#[cfg(feature = "rand")]
EvictionPolicy::Random => {
// Fraction of items that should be kept.
let threshold = self.max_size as f64 / len as f64;
for entries in self.frames.values_mut() {
entries.retain(|_| rand::random::<f64>() > threshold);
}
}
EvictionPolicy::Patterns => {
let kept = self.entries().filter(|f| f.properties().must_keep()).count();
@ -188,8 +178,6 @@ impl LayoutCache {
}
/// Cached frames from past layouting.
///
/// _This is only available when the `layout-cache` feature is enabled._
#[derive(Debug, Clone)]
pub struct FramesEntry {
/// The cached frames for a node.
@ -340,9 +328,6 @@ pub enum EvictionPolicy {
LeastRecentlyUsed,
/// Evict the least frequently used item.
LeastFrequentlyUsed,
/// Evict randomly.
#[cfg(feature = "rand")]
Random,
/// Use the pattern verdicts.
Patterns,
/// Do not evict.

View File

@ -1,12 +1,10 @@
//! Layouting infrastructure.
mod constraints;
#[cfg(feature = "layout-cache")]
mod incremental;
mod regions;
pub use constraints::*;
#[cfg(feature = "layout-cache")]
pub use incremental::*;
pub use regions::*;
@ -141,10 +139,6 @@ impl Layout for LayoutNode {
) -> TypResult<Vec<Constrained<Arc<Frame>>>> {
let styles = styles.barred(self.id());
#[cfg(not(feature = "layout-cache"))]
return self.0.layout(ctx, regions, styles);
#[cfg(feature = "layout-cache")]
let hash = {
let mut state = fxhash::FxHasher64::default();
self.hash(&mut state);
@ -154,7 +148,6 @@ impl Layout for LayoutNode {
// This is not written with `unwrap_or_else`, because then the
// #[track_caller] annotation doesn't work.
#[cfg(feature = "layout-cache")]
if let Some(frames) = vm.layout_cache.get(hash, regions) {
Ok(frames)
} else {
@ -199,18 +192,12 @@ impl Debug for LayoutNode {
impl PartialEq for LayoutNode {
fn eq(&self, other: &Self) -> bool {
// We cast to thin pointers for comparison because we don't want to
// compare vtables (which can be different across codegen units).
std::ptr::eq(
Arc::as_ptr(&self.0) as *const (),
Arc::as_ptr(&other.0) as *const (),
)
self.0.eq(&other.0)
}
}
trait Bounds: Layout + Debug + Sync + Send + 'static {
fn as_any(&self) -> &dyn Any;
fn hash64(&self) -> u64;
}
impl<T> Bounds for T
@ -220,21 +207,6 @@ where
fn as_any(&self) -> &dyn Any {
self
}
fn hash64(&self) -> u64 {
// Also hash the TypeId since nodes with different types but
// equal data should be different.
let mut state = fxhash::FxHasher64::default();
self.type_id().hash(&mut state);
self.hash(&mut state);
state.finish()
}
}
impl Hash for dyn Bounds {
fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u64(self.hash64());
}
}
/// A layout node that produces an empty frame.

View File

@ -62,7 +62,6 @@ use crate::export::RenderCache;
use crate::font::FontStore;
use crate::frame::Frame;
use crate::image::ImageStore;
#[cfg(feature = "layout-cache")]
use crate::layout::{EvictionPolicy, LayoutCache};
use crate::loading::Loader;
use crate::source::{SourceId, SourceStore};
@ -78,7 +77,6 @@ pub struct Context {
/// Stores decoded images.
pub images: ImageStore,
/// Caches layouting artifacts.
#[cfg(feature = "layout-cache")]
pub layout_cache: LayoutCache,
/// Caches rendering artifacts.
pub render_cache: RenderCache,
@ -120,7 +118,6 @@ impl Context {
/// Garbage-collect caches.
pub fn turnaround(&mut self) {
#[cfg(feature = "layout-cache")]
self.layout_cache.turnaround();
}
}
@ -131,9 +128,7 @@ impl Context {
pub struct ContextBuilder {
std: Option<Scope>,
styles: Option<StyleMap>,
#[cfg(feature = "layout-cache")]
policy: EvictionPolicy,
#[cfg(feature = "layout-cache")]
max_size: usize,
}
@ -152,7 +147,6 @@ impl ContextBuilder {
}
/// The policy for eviction of the layout cache.
#[cfg(feature = "layout-cache")]
pub fn cache_policy(mut self, policy: EvictionPolicy) -> Self {
self.policy = policy;
self
@ -162,7 +156,6 @@ impl ContextBuilder {
///
/// Note that this can be exceeded if more entries are categorized as [must
/// keep][crate::layout::PatternProperties::must_keep].
#[cfg(feature = "layout-cache")]
pub fn cache_max_size(mut self, max_size: usize) -> Self {
self.max_size = max_size;
self
@ -176,7 +169,6 @@ impl ContextBuilder {
fonts: FontStore::new(Arc::clone(&loader)),
images: ImageStore::new(Arc::clone(&loader)),
loader,
#[cfg(feature = "layout-cache")]
layout_cache: LayoutCache::new(self.policy, self.max_size),
render_cache: RenderCache::new(),
std: self.std.unwrap_or_else(library::new),
@ -190,9 +182,7 @@ impl Default for ContextBuilder {
Self {
std: None,
styles: None,
#[cfg(feature = "layout-cache")]
policy: EvictionPolicy::default(),
#[cfg(feature = "layout-cache")]
max_size: 2000,
}
}
@ -209,7 +199,6 @@ pub struct Vm<'a> {
/// Stores decoded images.
pub images: &'a mut ImageStore,
/// Caches layouting artifacts.
#[cfg(feature = "layout-cache")]
pub layout_cache: &'a mut LayoutCache,
/// The default styles.
pub styles: &'a StyleMap,
@ -223,7 +212,6 @@ pub struct Vm<'a> {
/// rules.
pub rules: Vec<TypeId>,
/// How deeply nested the current layout tree position is.
#[cfg(feature = "layout-cache")]
pub level: usize,
}

View File

@ -1,15 +1,12 @@
use std::any::Any;
use std::fmt::{self, Debug, Formatter};
use std::hash::{Hash, Hasher};
use std::ops::Deref;
#[cfg(feature = "layout-cache")]
use std::any::Any;
/// A wrapper around a type that precomputes its hash.
#[derive(Copy, Clone)]
pub struct Prehashed<T: ?Sized> {
/// The precomputed hash.
#[cfg(feature = "layout-cache")]
hash: u64,
/// The wrapped item.
item: T,
@ -19,7 +16,6 @@ impl<T: Hash + 'static> Prehashed<T> {
/// Compute an item's hash and wrap it.
pub fn new(item: T) -> Self {
Self {
#[cfg(feature = "layout-cache")]
hash: {
// Also hash the TypeId because the type might be converted
// through an unsized coercion.
@ -52,23 +48,16 @@ impl<T: Debug + ?Sized> Debug for Prehashed<T> {
}
}
impl<T: Hash + ?Sized> Hash for Prehashed<T> {
impl<T: ?Sized> Hash for Prehashed<T> {
fn hash<H: Hasher>(&self, state: &mut H) {
// Hash the node.
#[cfg(feature = "layout-cache")]
state.write_u64(self.hash);
#[cfg(not(feature = "layout-cache"))]
self.item.hash(state);
}
}
impl<T: Eq + ?Sized> Eq for Prehashed<T> {}
impl<T: PartialEq + ?Sized> PartialEq for Prehashed<T> {
impl<T: ?Sized> PartialEq for Prehashed<T> {
fn eq(&self, other: &Self) -> bool {
#[cfg(feature = "layout-cache")]
return self.hash == other.hash;
#[cfg(not(feature = "layout-cache"))]
self.item.eq(&other.item)
self.hash == other.hash
}
}

View File

@ -137,7 +137,8 @@
#test([a] == [a], true)
#test([[a]] == [a], true)
#test([] == [a], false)
#test(box[] == box[], false)
#test(box[] == box[], true)
#test(box[a] == box[], false)
---
// Test comparison operators.

View File

@ -1,10 +1,11 @@
use std::env;
use std::ffi::OsStr;
use std::fs;
use std::fs::{self, File};
use std::ops::Range;
use std::path::Path;
use std::sync::Arc;
use filedescriptor::{FileDescriptor, StdioDescriptor::*};
use tiny_skia as sk;
use walkdir::WalkDir;
@ -15,17 +16,10 @@ use typst::geom::{Length, RgbaColor};
use typst::library::{PageNode, TextNode};
use typst::loading::FsLoader;
use typst::parse::Scanner;
use typst::source::SourceFile;
use typst::source::{SourceFile, SourceId};
use typst::syntax::Span;
use typst::{Context, Vm};
#[cfg(feature = "layout-cache")]
use {
filedescriptor::{FileDescriptor, StdioDescriptor::*},
std::fs::File,
typst::source::SourceId,
};
const TYP_DIR: &str = "./typ";
const REF_DIR: &str = "./ref";
const PNG_DIR: &str = "./png";
@ -277,8 +271,7 @@ fn test_part(
let mut vm = Vm::new(ctx);
let (frames, mut errors) = match vm.typeset(id) {
Ok(mut frames) => {
#[cfg(feature = "layout-cache")]
(ok &= test_incremental(ctx, i, id, &frames));
ok &= test_incremental(ctx, i, id, &frames);
if !compare_ref {
frames.clear();
@ -474,7 +467,6 @@ fn test_reparse(src: &str, i: usize, rng: &mut LinearShift) -> bool {
ok
}
#[cfg(feature = "layout-cache")]
fn test_incremental(
ctx: &mut Context,
i: usize,
@ -591,7 +583,6 @@ fn render_links(
}
/// Disable stdout and stderr during execution of `f`.
#[cfg(feature = "layout-cache")]
fn silenced<F, T>(f: F) -> T
where
F: FnOnce() -> T,