From 227140b34d6316d54efcc89102a117da7e596c16 Mon Sep 17 00:00:00 2001 From: Kogia-sima Date: Sat, 6 Jun 2020 18:28:14 +0900 Subject: [PATCH] Add benches/ directory --- benches/Cargo.lock | 1650 ++++++++++++++++++++++++++++++ benches/Cargo.toml | 20 + benches/README.md | 35 + benches/benches/all.rs | 31 + benches/bigtable.png | Bin 0 -> 37009 bytes benches/src/askama_bench.rs | 58 ++ benches/src/build.rs | 11 + benches/src/fomat.rs | 76 ++ benches/src/horrorshow_bench.rs | 92 ++ benches/src/lib.rs | 7 + benches/src/markup_bench.rs | 83 ++ benches/src/sailfish.rs | 72 ++ benches/src/std_write.rs | 94 ++ benches/src/yarte_bench.rs | 58 ++ benches/teams.png | Bin 0 -> 41597 bytes benches/templates/big-table.hbs | 1 + benches/templates/big-table.html | 5 + benches/templates/big-table.stpl | 3 + benches/templates/teams.hbs | 1 + benches/templates/teams.html | 15 + benches/templates/teams.stpl | 11 + 21 files changed, 2323 insertions(+) create mode 100644 benches/Cargo.lock create mode 100644 benches/Cargo.toml create mode 100644 benches/README.md create mode 100644 benches/benches/all.rs create mode 100644 benches/bigtable.png create mode 100644 benches/src/askama_bench.rs create mode 100644 benches/src/build.rs create mode 100644 benches/src/fomat.rs create mode 100644 benches/src/horrorshow_bench.rs create mode 100644 benches/src/lib.rs create mode 100644 benches/src/markup_bench.rs create mode 100644 benches/src/sailfish.rs create mode 100644 benches/src/std_write.rs create mode 100644 benches/src/yarte_bench.rs create mode 100644 benches/teams.png create mode 100644 benches/templates/big-table.hbs create mode 100644 benches/templates/big-table.html create mode 100644 benches/templates/big-table.stpl create mode 100644 benches/templates/teams.hbs create mode 100644 benches/templates/teams.html create mode 100644 benches/templates/teams.stpl diff --git a/benches/Cargo.lock b/benches/Cargo.lock new file mode 100644 index 0000000..5bc0762 --- /dev/null +++ b/benches/Cargo.lock @@ -0,0 +1,1650 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler32" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" + +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "annotate-snippets" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78ea013094e5ea606b1c05fe35f1dd7ea1eb1ea259908d040b25bd5ec677ee5" +dependencies = [ + "yansi-term", +] + +[[package]] +name = "ansi_colours" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d0f302a81afc6a7f4350c04f0ba7cfab529cc009bca3324b3fb5764e6add8b6" +dependencies = [ + "cc", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + +[[package]] +name = "askama" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a1fb9e41eb366cbcd267da2094be5b7e62fdbca9f82091e7503e80f885050d" +dependencies = [ + "askama_derive", + "askama_escape", + "askama_shared", +] + +[[package]] +name = "askama_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1012c270085fa35ece6a48a569544fde85b6d9ee41074c7b706cc912a03f939" +dependencies = [ + "askama_shared", + "nom 5.1.1", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "askama_escape" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a577aeba5fec1aafb9f195d98cfcc38a78b588e4ebf9b15f62ca1c7aa33795a" + +[[package]] +name = "askama_shared" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee517f4e33c27b129928e71d8a044d54c513e72e0b72ec5c4f5f1823e9de353" +dependencies = [ + "askama_escape", + "humansize", + "num-traits", + "serde", + "toml", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "backtrace" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + +[[package]] +name = "base64" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" + +[[package]] +name = "benches" +version = "0.0.1" +dependencies = [ + "askama", + "criterion", + "fomat-macros", + "horrorshow", + "markup", + "sailfish", + "sailfish-macros", + "yarte", +] + +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "bstr" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "cc" +version = "1.0.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "clap" +version = "2.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +dependencies = [ + "ansi_term 0.11.0", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clicolors-control" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" +dependencies = [ + "atty", + "lazy_static", + "libc", + "winapi", +] + +[[package]] +name = "console" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586208b33573b7f76ccfbe5adb076394c88deaf81b84d7213969805b0a952a7" +dependencies = [ + "clicolors-control", + "encode_unicode", + "lazy_static", + "libc", + "regex", + "terminal_size", + "termios", + "unicode-width", + "winapi", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "content_inspector" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +dependencies = [ + "memchr", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab6bffe714b6bb07e42f201352c34f51fefd355ace793f9e638ebd52d23f98d2" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "csv" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.9.3", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_builder" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" +dependencies = [ + "darling", + "derive_builder_core", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2127768764f1556535c01b5326ef94bd60ff08dcfbdc544d53e69ed155610f5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "directories" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" +dependencies = [ + "cfg-if", + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" +dependencies = [ + "cfg-if", + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + +[[package]] +name = "error-chain" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" +dependencies = [ + "backtrace", + "version_check 0.9.2", +] + +[[package]] +name = "flate2" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fomat-macros" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe56556a8c9f9f556150eb6b390bc1a8b3715fd2ddbb4585f36b6a5672c6a833" + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" + +[[package]] +name = "hermit-abi" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" +dependencies = [ + "libc", +] + +[[package]] +name = "horrorshow" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ce7e0a1bc8e4489896abc94e5664e811a502a151bebfe113b3214fa181d3fb" + +[[package]] +name = "humansize" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" +dependencies = [ + "autocfg", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "js-sys" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "markup" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6ac8a12a86863ec68a3e8ec002f85212f8731e9f7723a4cdda8b5a45b0ccb4" +dependencies = [ + "markup-proc-macro", +] + +[[package]] +name = "markup-proc-macro" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ca1e2e1d8b8c6aeb80d14be1d22c13bfb949545b0e0a2bc35e369978a8c66c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "memoffset" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" +dependencies = [ + "adler32", +] + +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +dependencies = [ + "memchr", + "version_check 0.1.5", +] + +[[package]] +name = "nom" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" +dependencies = [ + "memchr", + "version_check 0.9.2", +] + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" + +[[package]] +name = "onig" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd91ccd8a02fce2f7e8a86655aec67bc6c171e6f8e704118a0e8c4b866a05a8a" +dependencies = [ + "bitflags", + "lazy_static", + "libc", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3814583fad89f3c60ae0701d80e87e1fd3028741723deda72d0d4a0ecf0cb0db" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "oorandom" +version = "11.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" + +[[package]] +name = "pkg-config" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" + +[[package]] +name = "plist" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b336d94e8e4ce29bf15bba393164629764744c567e8ad306cc1fdd0119967fd" +dependencies = [ + "base64 0.12.1", + "chrono", + "indexmap", + "line-wrap", + "serde", + "xml-rs", +] + +[[package]] +name = "plotters" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + +[[package]] +name = "prettyprint" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9764c1ec675e49ff70c4f76f0df91875d57220c4e7c8587d659684e91dd0ac" +dependencies = [ + "ansi_colours", + "ansi_term 0.12.1", + "atty", + "clap", + "console", + "content_inspector", + "derive_builder", + "directories", + "encoding", + "error-chain", + "lazy_static", + "shell-words", + "syntect", +] + +[[package]] +name = "proc-macro2" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2-impersonated" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32df793782c132f437089d84b487d617a0baac886fa8519751dca07db9266e0" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quote-impersonated" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3e450e6f50c99055b77f01eb206d8accbb7a1d14c2c7be2b0a829286296dc9" +dependencies = [ + "proc-macro2-impersonated", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" +dependencies = [ + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +dependencies = [ + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" + +[[package]] +name = "redox_users" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "remove_dir_all" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" +dependencies = [ + "winapi", +] + +[[package]] +name = "rust-argon2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" +dependencies = [ + "base64 0.11.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "sailfish" +version = "0.0.1" +dependencies = [ + "itoa", + "ryu", +] + +[[package]] +name = "sailfish-compiler" +version = "0.0.1" +dependencies = [ + "memchr", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sailfish-macros" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "sailfish-compiler", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shell-words" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "syn" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "syn-impersonated" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11664eb1aded8a1be30656bedb3c2ee3d6b594842c90ec635cf7b855a5d8478" +dependencies = [ + "proc-macro2-impersonated", + "quote-impersonated", + "unicode-xid", +] + +[[package]] +name = "syntect" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b43a6ca1829ccb0c933b615c9ea83ffc8793ae240cecbd15119b13d741161d" +dependencies = [ + "bincode", + "bitflags", + "flate2", + "fnv", + "lazy_static", + "lazycell", + "onig", + "plist", + "regex-syntax", + "serde", + "serde_derive", + "serde_json", + "walkdir", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "terminal_size" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8038f95fc7a6f351163f4b964af631bd26c9e828f7db085f2a84aca56f70d13b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "termios" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" +dependencies = [ + "libc", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tinytemplate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "toml" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +dependencies = [ + "serde", +] + +[[package]] +name = "toolchain_find" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e458af37ead6107144c2e3bb892f605ddfad20251f12143cda8b9c9072b1ca45" +dependencies = [ + "dirs", + "lazy_static", + "regex", + "semver", + "walkdir", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "v_escape" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" +dependencies = [ + "v_escape_derive", +] + +[[package]] +name = "v_escape_derive" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" +dependencies = [ + "nom 4.2.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "v_eval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a419cdda656c514fbb974d5634994278be348867645cb65bf21a9b0676b9c2" +dependencies = [ + "regex", + "syn-impersonated", +] + +[[package]] +name = "v_htmlescape" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" +dependencies = [ + "cfg-if", + "v_escape", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "walkdir" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasm-bindgen" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd" + +[[package]] +name = "web-sys" +version = "0.3.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "xml-rs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + +[[package]] +name = "yarte" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884cff3b02a11d026c493282e598a5c990b17fa22b91fb73aad2bfeee47f4f01" +dependencies = [ + "yarte_derive", + "yarte_helpers", +] + +[[package]] +name = "yarte_codegen" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64e8ba00f9d77cd05b665b3515251544c5b1f4885e7e3f7ffc54ea27f52eabc" +dependencies = [ + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "yarte_helpers", + "yarte_hir", +] + +[[package]] +name = "yarte_derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f11ebd841875bd9b906017844640aaac1571a4a188b3f7577efd6c02616da1" +dependencies = [ + "prettyprint", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "tempfile", + "toolchain_find", + "yarte_codegen", + "yarte_helpers", + "yarte_hir", + "yarte_parser", +] + +[[package]] +name = "yarte_helpers" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771250e834a31e39a6e34e48e3fd9032542d211cb3f194f9a71b603fb841a793" +dependencies = [ + "serde", + "toml", + "v_htmlescape", +] + +[[package]] +name = "yarte_hir" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86bad7da0c2ae56374390919fa1d7abaa067f6325a3e27865ae8598bfc24057" +dependencies = [ + "derive_more", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "v_eval", + "v_htmlescape", + "yarte_helpers", + "yarte_parser", +] + +[[package]] +name = "yarte_parser" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f855c622d29c8a8af4f4b7a3f81e83ac0be6e6074977a017c3945db05fba311" +dependencies = [ + "annotate-snippets", + "derive_more", + "proc-macro2-impersonated", + "quote-impersonated", + "syn-impersonated", + "unicode-xid", + "yarte_helpers", +] diff --git a/benches/Cargo.toml b/benches/Cargo.toml new file mode 100644 index 0000000..3b380de --- /dev/null +++ b/benches/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "benches" +version = "0.0.1" +authors = ["Ryohei Machida "] +edition = "2018" +publish = false + +[dependencies] +horrorshow = "0.8.3" +markup = "0.4.1" +askama = "0.9.0" +criterion = "0.3.2" +yarte = "0.8.3" +sailfish = { path = "../sailfish" } +sailfish-macros = { path = "../sailfish-macros" } +fomat-macros = "0.3.1" + +[[bench]] +name = "all" +harness = false diff --git a/benches/README.md b/benches/README.md new file mode 100644 index 0000000..43dcde0 --- /dev/null +++ b/benches/README.md @@ -0,0 +1,35 @@ +# Rust template engine benchmarks + +Performance comparison of template engines for Rust based on [criterion](https://github.com/bheisler/criterion.rs) crate + +## crates + +- [askama](https://github.com/djc/askama): Type-safe, compiled Jinja-like templates for Rust +- [fomat](https://github.com/krdln/fomat-macros): Alternative syntax for printing macros in Rust +- [horrorshow](https://github.com/Stebalien/horrorshow-rs): A macro-based html builder for rust +- [markup](https://github.com/utkarshkukreti/markup.rs): A blazing fast, type-safe template engine for Rust. +- [std::write!](https://doc.rust-lang.org/std/macro.write.html): the std library `write!` macro +- [yarte](https://github.com/botika/yarte): Yet Another Rust Template Engine, is the fastest template engine +- [sailfish](https://github.com/Kogia-sima/sailfish): Simple, small, and extremely fast template engine for Rust + +## Running the benchmarks + +```console +$ cargo bench +``` + +## Environment + +- OS: Ubuntu 20.04 LTS +- CPU Model Name: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz +- BogoMIPS: 3600.00 + +## Results + +- Big table + +![Big table](./bigtable.png) + +- Teams + +![Teams](./teams.png) diff --git a/benches/benches/all.rs b/benches/benches/all.rs new file mode 100644 index 0000000..dbf421f --- /dev/null +++ b/benches/benches/all.rs @@ -0,0 +1,31 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use benches::{ + askama_bench, fomat, horrorshow_bench, markup_bench, sailfish, std_write, yarte_bench +}; + +fn big_table(c: &mut Criterion) { + let mut g = c.benchmark_group("Big table"); + g.bench_function("Askama", |b| askama_bench::big_table(b, &100)); + g.bench_function("fomat", |b| fomat::big_table(b, &100)); + g.bench_function("Horrorshow", |b| horrorshow_bench::big_table(b, &100)); + g.bench_function("Markup", |b| markup_bench::big_table(b, &100)); + g.bench_function("Yarte", |b| yarte_bench::big_table(b, &100)); + g.bench_function("write", |b| std_write::big_table(b, &100)); + g.bench_function("sailfish", |b| sailfish::big_table(b, &100)); + g.finish(); +} + +fn teams(c: &mut Criterion) { + let mut g = c.benchmark_group("Teams"); + g.bench_function("Askama", |b| askama_bench::teams(b, &0)); + g.bench_function("fomat", |b| fomat::teams(b, &0)); + g.bench_function("Horrorshow", |b| horrorshow_bench::teams(b, &0)); + g.bench_function("Markup", |b| markup_bench::teams(b, &0)); + g.bench_function("Yarte", |b| yarte_bench::teams(b)); + g.bench_function("write", |b| std_write::teams(b, &0)); + g.bench_function("sailfish", |b| sailfish::teams(b)); + g.finish(); +} + +criterion_group!(benches, big_table, teams); +criterion_main!(benches); diff --git a/benches/bigtable.png b/benches/bigtable.png new file mode 100644 index 0000000000000000000000000000000000000000..59ffdb680b297a4dc67b9e3b160e9f90879de5ca GIT binary patch literal 37009 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 Pm9)Bw_WkmEk6-*hk-m?k literal 0 HcmV?d00001 diff --git a/benches/src/askama_bench.rs b/benches/src/askama_bench.rs new file mode 100644 index 0000000..fd51f81 --- /dev/null +++ b/benches/src/askama_bench.rs @@ -0,0 +1,58 @@ +use askama::Template; +use criterion; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + let ctx = BigTable { table }; + b.iter(|| ctx.render().unwrap()); +} + +#[derive(Template)] +#[template(path = "big-table.html")] +struct BigTable { + table: Vec>, +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| teams.render().unwrap()); +} + +#[derive(Template)] +#[template(path = "teams.html")] +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/build.rs b/benches/src/build.rs new file mode 100644 index 0000000..ade7fb1 --- /dev/null +++ b/benches/src/build.rs @@ -0,0 +1,11 @@ +use ructe::Ructe; +use std::env; +use std::path::PathBuf; + +fn main() { + let in_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("templates_ructe"); + Ructe::from_env() + .unwrap() + .compile_templates(&in_dir) + .expect("compile templates"); +} diff --git a/benches/src/fomat.rs b/benches/src/fomat.rs new file mode 100644 index 0000000..c1c72df --- /dev/null +++ b/benches/src/fomat.rs @@ -0,0 +1,76 @@ +use criterion; +use fomat_macros::fomat; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + fomat!( + "\n" + for r1 in &table { + "\n" + for r2 in r1 { "" } + "\n\n" + } + "
"(r2)"
" + ) + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + fomat!( +" + + "(teams.year)" + + +

CSL "(teams.year)"

+
    " + for (i,team) in (&teams).teams.iter().enumerate() { + "
  • \n" + " "(team.name)": "(team.score)"\n" + "
  • \n" + } +"\n
+ +") + }); +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/horrorshow_bench.rs b/benches/src/horrorshow_bench.rs new file mode 100644 index 0000000..bfb66b8 --- /dev/null +++ b/benches/src/horrorshow_bench.rs @@ -0,0 +1,92 @@ +use criterion; +use horrorshow::html; +use horrorshow::prelude::*; +use horrorshow::Error; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| big_table_render(&table).unwrap()); +} + +fn big_table_render(table: &Vec>) -> Result { + let page = html! { + table { + @ for row in table { + tr { + @ for col in row { + td { : col } + } + } + } + } + }; + page.into_string() +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + + b.iter(|| teams_render(&teams).unwrap()); +} + +fn teams_render(teams: &Teams) -> Result { + let page = html! { + html { + head { + title { : teams.year } + } + body { + h1 { : Raw("CSL "); + : teams.year + } + ul { + @ for (idx, team) in teams.teams.iter().enumerate() { + li(class? = if idx == 0 { Some(Raw("champion")) } else { None }) { + b { : &team.name } + : Raw(": "); + : team.score + } + } + } + } + } + }; + page.into_string() +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/lib.rs b/benches/src/lib.rs new file mode 100644 index 0000000..68b1e10 --- /dev/null +++ b/benches/src/lib.rs @@ -0,0 +1,7 @@ +pub mod askama_bench; +pub mod fomat; +pub mod horrorshow_bench; +pub mod markup_bench; +pub mod sailfish; +pub mod std_write; +pub mod yarte_bench; diff --git a/benches/src/markup_bench.rs b/benches/src/markup_bench.rs new file mode 100644 index 0000000..a9c9c23 --- /dev/null +++ b/benches/src/markup_bench.rs @@ -0,0 +1,83 @@ +use criterion; +use markup::define; + +// TODO: Switch to `markup::define!` when upgrading to Rust 2018. +define! { + BigTable<'a>(table: &'a [Vec]) { + table { + @for r1 in table.iter() { + tr { + @for r2 in r1.iter() { + td { {*r2} } + } + } + } + } + } +} + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| BigTable { table: &table }.to_string()); +} + +pub struct Team { + name: String, + score: u8, +} + +define! { + Teams<'a>(year: u32, teams: &'a [Team]) { + html { + head { + title { {year} } + } + body { + h1 { "CSL " {year} } + ul { + @for (index, team) in teams.iter().enumerate() { + li.{if index == 0 { Some("champion") } else { None }} { + b { {team.name} } ": " {team.score} + } + } + } + } + } + } +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let year = 2015; + let teams = vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ]; + b.iter(|| { + Teams { + year, + teams: &teams, + } + .to_string() + }); +} diff --git a/benches/src/sailfish.rs b/benches/src/sailfish.rs new file mode 100644 index 0000000..4d00a27 --- /dev/null +++ b/benches/src/sailfish.rs @@ -0,0 +1,72 @@ +use sailfish::TemplateOnce; +use sailfish_macros::TemplateOnce; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + let ctx = BigTable { table: &table }; + ctx.render_once().unwrap() + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + let teams = TeamsTemplate { + year: teams.year, + teams: &teams.teams + }; + teams.render_once().unwrap() + }); +} + +#[derive(TemplateOnce)] +#[template(path = "big-table.stpl")] +struct BigTable<'a> { + table: &'a [Vec], +} + +#[derive(TemplateOnce)] +#[template(path = "teams.stpl")] +struct TeamsTemplate<'a> { + year: u16, + teams: &'a [Team], +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/std_write.rs b/benches/src/std_write.rs new file mode 100644 index 0000000..d147ebd --- /dev/null +++ b/benches/src/std_write.rs @@ -0,0 +1,94 @@ +use std::io::Write; + +use criterion; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + b.iter(|| { + let mut output = Vec::new(); + write!(&mut output, "").unwrap(); + for r1 in &table { + write!(&mut output, "\n").unwrap(); + for r2 in r1 { + write!(&mut output, "", col = r2).unwrap(); + } + write!(&mut output, "\n").unwrap(); + } + write!(&mut output, "
{col}
").unwrap(); + }); +} + +pub fn teams(b: &mut criterion::Bencher<'_>, _: &usize) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| { + let mut output = Vec::new(); + write!( + &mut output, + " + + {year} + + +

CSL {year}

+
    ", + year = teams.year + ) + .unwrap(); + for (i, team) in (&teams).teams.iter().enumerate() { + let champion = if i != 0 { "" } else { "champion" }; + write!( + &mut output, + "
  • + {name}: {score}", + champion = champion, + name = team.name, + score = team.score + ) + .unwrap(); + } + write!( + &mut output, + "
+ + " + ) + .unwrap(); + }); +} + +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/src/yarte_bench.rs b/benches/src/yarte_bench.rs new file mode 100644 index 0000000..6678268 --- /dev/null +++ b/benches/src/yarte_bench.rs @@ -0,0 +1,58 @@ +use yarte::Template; + +pub fn big_table(b: &mut criterion::Bencher<'_>, size: &usize) { + let mut table = Vec::with_capacity(*size); + for _ in 0..*size { + let mut inner = Vec::with_capacity(*size); + for i in 0..*size { + inner.push(i); + } + table.push(inner); + } + let ctx = BigTable { table }; + b.iter(|| ctx.call().unwrap()); +} + +#[derive(Template)] +#[template(path = "big-table.hbs")] +struct BigTable { + table: Vec>, +} + +pub fn teams(b: &mut criterion::Bencher<'_>) { + let teams = Teams { + year: 2015, + teams: vec![ + Team { + name: "Jiangsu".into(), + + score: 43, + }, + Team { + name: "Beijing".into(), + score: 27, + }, + Team { + name: "Guangzhou".into(), + score: 22, + }, + Team { + name: "Shandong".into(), + score: 12, + }, + ], + }; + b.iter(|| teams.call().unwrap()); +} + +#[derive(Template)] +#[template(path = "teams.hbs")] +struct Teams { + year: u16, + teams: Vec, +} + +struct Team { + name: String, + score: u8, +} diff --git a/benches/teams.png b/benches/teams.png new file mode 100644 index 0000000000000000000000000000000000000000..604dcde65be51ca83228e56ecbecee701dba9fe6 GIT binary patch literal 41597 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 O*y$wVMESAv*Zu{{#each table}}{{#each this}}{{ this }}{{/each}}{{/each}} diff --git a/benches/templates/big-table.html b/benches/templates/big-table.html new file mode 100644 index 0000000..2fbfce4 --- /dev/null +++ b/benches/templates/big-table.html @@ -0,0 +1,5 @@ + +{% for row in table %} +{% for col in row %}{% endfor %} +{% endfor %} +
{{ col|escape }}
diff --git a/benches/templates/big-table.stpl b/benches/templates/big-table.stpl new file mode 100644 index 0000000..52c442f --- /dev/null +++ b/benches/templates/big-table.stpl @@ -0,0 +1,3 @@ + + <% for row in table { %><% for col in row { %><% } %><% } %> +
<%= *col %>
diff --git a/benches/templates/teams.hbs b/benches/templates/teams.hbs new file mode 100644 index 0000000..5af2727 --- /dev/null +++ b/benches/templates/teams.hbs @@ -0,0 +1 @@ +{{ year }}

CSL {{ year }}

    {{#each teams }}
  • {{ name }}: {{ score }}
  • {{/each}}
diff --git a/benches/templates/teams.html b/benches/templates/teams.html new file mode 100644 index 0000000..cbeaec9 --- /dev/null +++ b/benches/templates/teams.html @@ -0,0 +1,15 @@ + + + {{ year }} + + +

CSL {{ year }}

+
    + {% for team in teams %} +
  • + {{ team.name }}: {{ team.score }} +
  • + {% endfor %} +
+ + diff --git a/benches/templates/teams.stpl b/benches/templates/teams.stpl new file mode 100644 index 0000000..e766b2d --- /dev/null +++ b/benches/templates/teams.stpl @@ -0,0 +1,11 @@ + + + <%= year %> + + +

CSL <%= year %>

+
    + <% for (i, team) in teams.iter().enumerate() { %>
  • <%- team.name %>: <%= team.score %>
  • <% } %> +
+ +