diff options
author | Karl Berry <karl@freefriends.org> | 2018-10-26 20:51:49 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-10-26 20:51:49 +0000 |
commit | f19fcbb4940b9c3173f5b3528723e1b4291c55db (patch) | |
tree | 63162bd1132dcba4e26f5a5d74fe9085a9827711 /Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty | |
parent | 2415f1f4bd02c45f670cecdbcfbbe7cb2b1ef488 (diff) |
l3 (26oct18)
git-svn-id: svn://tug.org/texlive/trunk@48997 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty new file mode 100644 index 00000000000..b761f3c948d --- /dev/null +++ b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty @@ -0,0 +1,304 @@ +%% +%% This is file `l3benchmark.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% l3benchmark.dtx (with options: `package') +%% +%% Copyright (C) 2018 The LaTeX3 Project +%% +%% It may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License (LPPL), either version 1.3c of +%% this license or (at your option) any later version. The latest +%% version of this license is in the file: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This file is part of the "l3experimental bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: l3benchmark.dtx Copyright (C) 2011,2012,2014-2018 The LaTeX3 Project +\RequirePackage{expl3} +\ProvidesExplPackage{l3benchmark}{2018-10-26}{} + {L3 Experimental benchmarking} +\sys_if_engine_luatex:TF + { + \cs_new:Npn \sys_timer: + { \int_eval:w \lua_now:n { l3kernel.elapsedtime() } \scan_stop: } + } + { + \cs_if_exist:NT \tex_elapsedtime:D + { + \cs_new:Npn \sys_timer: + { \int_eval:w \tex_elapsedtime:D } + } + } +\__sys_const:nn { sys_if_timer_exist } + { \cs_if_exist_p:N \sys_timer: } +\cs_if_exist:NTF \sys_timer: + { + \sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \sys_gzero_timer: + { \lua_now:n { l3kernel.resettimer() } } + } + { \cs_new_protected:Npn \sys_gzero_timer: { \tex_resettimer:D } } + } + { + \__kernel_msg_new:nnnn { kernel } { no-elapsed-time } + { No~clock~detected~for~#1. } + { The~current~engine~provides~no~way~to~access~the~system~time. } + \cs_new_protected:Npn \sys_gzero_timer: + { + \__kernel_msg_error:nnn { kernel } { no-elapsed-time } + { \sys_gzero_timer: } + } + \cs_new:Npn \sys_timer: + { + \int_value:w + \__kernel_msg_expandable_error:nnn { kernel } { no-elapsed-time } + { \sys_timer: } + \c_zero_int + } + } +\fp_new:N \g_benchmark_time_fp +\fp_new:N \g_benchmark_ops_fp +\cs_new_protected:Npn \benchmark_display: + { \iow_term:x { \fp_to_tl:N \g_benchmark_time_fp \c_space_tl seconds } } +\cs_new_protected:Npn \benchmark_display_in_ops: + { + \iow_term:x + { + \fp_compare:nTF { \g_benchmark_ops_fp > 1e9 } + { \fp_to_tl:n { \g_benchmark_ops_fp * 1e-9 } ~ G~ops } + { + \fp_compare:nTF { \g_benchmark_ops_fp > 1e6 } + { \fp_to_tl:n { \g_benchmark_ops_fp * 1e-6 } ~ M~ops } + { + \fp_compare:nTF { \g_benchmark_ops_fp > 1e3 } + { \fp_to_tl:n { \g_benchmark_ops_fp * 1e-3 } ~ K~ops } + { \fp_to_tl:n { \g_benchmark_ops_fp } ~ ops } + } + } + } + } +\sys_if_timer_exist:F + { + \msg_new:nnnn { benchmark } { no-time } + { The~l3benchmark~package~failed~to~access~a~clock. } + { The~current~engine~provides~no~way~to~access~the~system~time. } + \cs_new_protected:Npn \benchmark_once:n #1 + { \msg_error:nn { benchmark } { no-time } } + \cs_new_protected:Npn \benchmark_once_in_ops:n #1 + { \msg_error:nn { benchmark } { no-time } } + \cs_new_protected:Npn \benchmark_once_silent:n #1 + { \msg_error:nn { benchmark } { no-time } } + \cs_new_protected:Npn \benchmark:n #1 + { \msg_error:nn { benchmark } { no-time } } + \cs_new_protected:Npn \benchmark_in_ops:n #1 + { \msg_error:nn { benchmark } { no-time } } + \cs_new_protected:Npn \benchmark_silent:n #1 + { \msg_error:nn { benchmark } { no-time } } + \fp_gset:Nn \g_benchmark_time_fp { nan } + \fp_gset:Nn \g_benchmark_ops_fp { nan } + \msg_critical:nn { benchmark } { no-time } + } +\fp_new:N \g_benchmark_duration_target_fp +\fp_gset:Nn \g_benchmark_duration_target_fp { 1 } +\int_new:N \g__benchmark_duration_int +\int_new:N \g__benchmark_time_int +\int_new:N \g__benchmark_time_a_int +\int_new:N \g__benchmark_time_b_int +\int_new:N \g__benchmark_time_c_int +\int_new:N \g__benchmark_time_d_int +\int_new:N \g__benchmark_repeat_int +\int_new:N \g__benchmark_nesting_int +\cs_new_protected:Npn \__benchmark_raw:nN #1 + { + \int_gincr:N \g__benchmark_nesting_int + \exp_args:Nc \__benchmark_raw_aux:N + { g__benchmark_ \int_use:N \g__benchmark_nesting_int _int } + \__benchmark_raw_aux: + #1 + \__benchmark_raw_end:N + } +\cs_new_protected:Npn \__benchmark_raw_aux:N #1 + { + \int_gzero_new:N #1 + \cs_gset_protected:Npn \__benchmark_raw_aux: { \int_gset:Nn #1 { \sys_timer: } } + } +\cs_new_protected:Npn \__benchmark_raw_end:N #1 + { + \int_gset:Nn #1 + { + \sys_timer: - + \int_use:c { g__benchmark_ \int_use:N \g__benchmark_nesting_int _int } + } + \int_gdecr:N \g__benchmark_nesting_int + } +\cs_new_eq:NN \__benchmark_tmp:w ? +\cs_new_protected:Npn \__benchmark_raw_replicate:nnN #1 + { + \int_compare:nNnTF {#1} > { 500000 } + { \__benchmark_raw_replicate_large:nnN {#1} } + { \__benchmark_raw_replicate_small:nnN {#1} } + } +\cs_new_protected:Npn \__benchmark_raw_replicate_large:nnN #1#2 + { + \cs_set:Npx \__benchmark_tmp:w ##1 { \prg_replicate:nn { 5000 } {##1} } + \exp_args:Nno \__benchmark_raw_replicate:nnN { #1 / 5000 } + { \__benchmark_tmp:w {#2} } + } +\cs_new_protected:Npn \__benchmark_raw_replicate_small:nnN #1#2 + { + \cs_set:Npx \__benchmark_tmp:w ##1##2 { \prg_replicate:nn {#1} {##1} } + \__benchmark_raw:nN { \__benchmark_tmp:w {#2} { } } \g__benchmark_time_int + \exp_args:No \__benchmark_raw_replicate_aux:nnN + { \int_use:N \g__benchmark_time_int } {#2} + } +\cs_new_protected:Npn \__benchmark_raw_replicate_aux:nnN #1#2#3 + { + \__benchmark_raw:nN { \__benchmark_tmp:w { } {#2} } \g__benchmark_time_int + \int_gset:Nn #3 { #1 - \g__benchmark_time_int } + \cs_set_eq:NN \__benchmark_tmp:w \prg_do_nothing: + } +\fp_new:N \g__benchmark_one_op_fp +\tl_new:N \g__benchmark_code_tl +\cs_new_protected:Npn \benchmark:n #1 + { \benchmark_silent:n {#1} \benchmark_display: } +\cs_new_protected:Npn \benchmark_in_ops:n #1 + { \benchmark_silent:n {#1} \benchmark_display_in_ops: } +\cs_new_protected:Npn \__benchmark_measure_op: + { + \int_gset:Nn \g__benchmark_duration_int { 256 } + \tl_gset:Nn \g__benchmark_code_tl + { \int_gset:Nn \g__benchmark_duration_int { 256 } } % arbitrary single operation + \__benchmark_aux: + \fp_gset_eq:NN \g__benchmark_one_op_fp \g_benchmark_time_fp + \fp_compare:nNnT \g__benchmark_one_op_fp < { 1e-6 } + { \fp_gset:Nn \g__benchmark_one_op_fp { 1e-6 } } + } +\cs_new_protected:Npn \benchmark_silent:n #1 + { + \__benchmark_measure_op: + \int_gset:Nn \g__benchmark_duration_int + { \fp_to_int:n { 65536 * \g_benchmark_duration_target_fp } } + \tl_gset:Nn \g__benchmark_code_tl {#1} + \__benchmark_aux: + \fp_gset:Nn \g_benchmark_ops_fp + { \g_benchmark_time_fp / \g__benchmark_one_op_fp } + } +\cs_new_protected:Npn \__benchmark_aux: + { + \int_gset:Nn \g__benchmark_repeat_int { 1 } + \__benchmark_raw:nN { \g__benchmark_code_tl } \g__benchmark_time_int + \int_compare:nNnF \g__benchmark_time_int < { \g__benchmark_duration_int / 2 } + { + \int_gset_eq:NN \g__benchmark_time_a_int \g__benchmark_time_int + \int_gset_eq:NN \g__benchmark_time_b_int \g__benchmark_time_int + \int_gset_eq:NN \g__benchmark_time_c_int \g__benchmark_time_int + \int_gset_eq:NN \g__benchmark_time_d_int \g__benchmark_time_int + \prg_break: + } + \int_while_do:nNnn \g__benchmark_time_int < { \g__benchmark_duration_int / 100 } + { + \int_compare:nNnT \g__benchmark_repeat_int > { \c_max_int / 4 } + { + \int_gzero:N \g__benchmark_time_a_int + \int_gzero:N \g__benchmark_time_b_int + \int_gzero:N \g__benchmark_time_c_int + \int_gzero:N \g__benchmark_time_d_int + \prg_break: + } + \int_gset:Nn \g__benchmark_repeat_int { 4 * \g__benchmark_repeat_int } + \__benchmark_run:N \g__benchmark_time_int + } + \int_gset:Nn \g__benchmark_repeat_int + { + \int_max:nn { 1 } + { + \g__benchmark_duration_int * \g__benchmark_repeat_int + / ( \g__benchmark_time_int * 4 ) + } + } + \int_compare:nNnTF \g__benchmark_repeat_int = 1 + { \int_gset_eq:NN \g__benchmark_time_a_int \g__benchmark_time_int } + { \__benchmark_run:N \g__benchmark_time_a_int } + \__benchmark_run:N \g__benchmark_time_b_int + \__benchmark_run:N \g__benchmark_time_c_int + \__benchmark_run:N \g__benchmark_time_d_int + \prg_break_point: + \fp_gset:Nn \g_benchmark_time_fp + { + \int_min:nn + { \int_min:nn \g__benchmark_time_a_int \g__benchmark_time_b_int } + { \int_min:nn \g__benchmark_time_c_int \g__benchmark_time_d_int } + / \g__benchmark_repeat_int / 65536 + } + } +\cs_new_protected:Npn \__benchmark_run:N + { \exp_args:NNo \__benchmark_raw_replicate:nnN \g__benchmark_repeat_int { \g__benchmark_code_tl } } +\cs_new_protected:Npn \benchmark_once:n #1 + { \benchmark_once_silent:n {#1} \benchmark_display: } +\cs_new_protected:Npn \benchmark_once_in_ops:n #1 + { \benchmark_once_silent:n {#1} \benchmark_display_in_ops: } +\cs_new_protected:Npn \benchmark_once_silent:n #1 + { + \__benchmark_measure_op: + \__benchmark_raw:nN {#1} \g__benchmark_time_int + \fp_gset:Nn \g_benchmark_time_fp { \g__benchmark_time_int / 65536 } + \fp_gset:Nn \g_benchmark_ops_fp + { \g_benchmark_time_fp / \g__benchmark_one_op_fp } + } +\int_new:N \g__benchmark_tictoc_int +\seq_new:N \g__benchmark_tictoc_seq +\cs_new_protected:Npn \benchmark_tic: + { + \int_compare:nTF { \g__benchmark_tictoc_int == 0 } + { + \sys_gzero_timer: + \__benchmark_tic:n { 0 } + } + { \__benchmark_tic: } + } +\cs_new_protected:Npn \__benchmark_tic: + { + \exp_args:NNf \seq_put_right:Nn \g__benchmark_tictoc_seq { \sys_timer: } + \int_gincr:N \g__benchmark_tictoc_int + \iow_term:x + { + \prg_replicate:nn {\g__benchmark_tictoc_int} {---+} \space + TIC + } + } +\cs_new:Npn \benchmark_toc: + { + \int_compare:nT { \g__benchmark_tictoc_int == 0 } + { \msg_error:nn {benchmark} {toc-first} } + \seq_pop_right:NN \g__benchmark_tictoc_seq \l__benchmark_tictoc_pop_tl + \__benchmark_toc: + } +\cs_new_protected:Npn \__benchmark_toc: + { + \tl_set:Nx \l__benchmark_tictoc_tl + { + \fp_to_decimal:n + { round( ( \sys_timer: - \l__benchmark_tictoc_pop_tl) / 65536 , 3 ) } + } + \iow_term:x + { + \prg_replicate:nn {\g__benchmark_tictoc_int} {---+} \c_space_tl + TOC: \c_space_tl + \l__benchmark_tictoc_tl \c_space_tl s + } + \int_gdecr:N \g__benchmark_tictoc_int + } +\msg_new:nnn {benchmark} {toc-first} + { + \token_to_str:N \benchmark_toc: \space without~ + \token_to_str:N \benchmark_tic: \space ! + } +%% +%% +%% End of file `l3benchmark.sty'. |