[latex3-commits] [git/LaTeX3-latex3-latex3] master: Speed up \seq_count:N four-fold for large sequences (0e6cabc)
Bruno Le Floch
bruno at le-floch.fr
Sun Apr 29 17:46:20 CEST 2018
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/0e6cabc13179d56d0476d35f43361777825741a7
>---------------------------------------------------------------
commit 0e6cabc13179d56d0476d35f43361777825741a7
Author: Bruno Le Floch <bruno at le-floch.fr>
Date: Sun Apr 29 11:40:53 2018 -0400
Speed up \seq_count:N four-fold for large sequences
>---------------------------------------------------------------
0e6cabc13179d56d0476d35f43361777825741a7
l3kernel/l3seq.dtx | 31 ++++++++++++++++++++++++-------
l3kernel/testfiles/m3expl001.luatex.tlg | 3 ++-
l3kernel/testfiles/m3expl001.ptex.tlg | 3 ++-
l3kernel/testfiles/m3expl001.tlg | 3 ++-
l3kernel/testfiles/m3expl001.uptex.tlg | 3 ++-
l3kernel/testfiles/m3expl001.xetex.tlg | 3 ++-
l3kernel/testfiles/m3expl003.luatex.tlg | 3 ++-
l3kernel/testfiles/m3expl003.ptex.tlg | 3 ++-
l3kernel/testfiles/m3expl003.tlg | 3 ++-
l3kernel/testfiles/m3expl003.uptex.tlg | 3 ++-
l3kernel/testfiles/m3expl003.xetex.tlg | 3 ++-
l3kernel/testfiles/m3seq005.lvt | 9 ++++++++-
12 files changed, 52 insertions(+), 18 deletions(-)
diff --git a/l3kernel/l3seq.dtx b/l3kernel/l3seq.dtx
index b5f6ba9..9e69f4f 100644
--- a/l3kernel/l3seq.dtx
+++ b/l3kernel/l3seq.dtx
@@ -1826,20 +1826,37 @@
% \end{macro}
%
% \begin{macro}{\seq_count:N, \seq_count:c}
-% \begin{macro}{\@@_count:n}
-% Counting the items in a sequence is done using the same approach as for
-% other count functions: turn each entry into a \texttt{+1} then use
-% integer evaluation to actually do the mathematics.
+% \begin{macro}{\@@_count:w, \@@_count_end:w}
+% Since counting the items in a sequence is quite common, we optimize
+% it by grabbing $8$~items at a time and correspondingly adding $8$ to
+% an integer expression. At the end of the loop, |#9| is
+% \cs{@@_count_end:w} instead of being empty. It removes |8+| and
+% instead places the number of \cs{@@_item:n} that \cs{@@_count:w}
+% grabbed before reaching the end of the sequence.
% \begin{macrocode}
\cs_new:Npn \seq_count:N #1
{
\int_eval:n
{
- 0
- \seq_map_function:NN #1 \@@_count:n
+ \exp_after:wN \use_i:nn
+ \exp_after:wN \@@_count:w
+ #1
+ \@@_count_end:w \@@_item:n 7
+ \@@_count_end:w \@@_item:n 6
+ \@@_count_end:w \@@_item:n 5
+ \@@_count_end:w \@@_item:n 4
+ \@@_count_end:w \@@_item:n 3
+ \@@_count_end:w \@@_item:n 2
+ \@@_count_end:w \@@_item:n 1
+ \@@_count_end:w \@@_item:n 0
+ \prg_break_point:
}
}
-\cs_new:Npn \@@_count:n #1 { + 1 }
+\cs_new:Npn \@@_count:w
+ #1 \@@_item:n #2 \@@_item:n #3 \@@_item:n #4 \@@_item:n
+ #5 \@@_item:n #6 \@@_item:n #7 \@@_item:n #8 #9 \@@_item:n
+ { #9 8 + \@@_count:w }
+\cs_new:Npn \@@_count_end:w 8 + \@@_count:w #1#2 \prg_break_point: {#1}
\cs_generate_variant:Nn \seq_count:N { c }
% \end{macrocode}
% \end{macro}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 1977c47..82dd809 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -1177,7 +1177,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 6b7a3ca..5dc0865 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 034c0fe..4abf80c 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index a976cec..48c73c6 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 71e818f..b62b5f4 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 1977c47..82dd809 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -1177,7 +1177,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 6b7a3ca..5dc0865 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 034c0fe..4abf80c 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index a976cec..48c73c6 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 71e818f..b62b5f4 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -1175,7 +1175,8 @@ Defining \seq_map_variable:Ncn on line ...
Defining \seq_map_variable:cNn on line ...
Defining \seq_map_variable:ccn on line ...
Defining \seq_count:N on line ...
-Defining \__seq_count:n on line ...
+Defining \__seq_count:w on line ...
+Defining \__seq_count_end:w on line ...
Defining \seq_count:c on line ...
Defining \seq_use:Nnnn on line ...
Defining \seq_use:cnnn on line ...
diff --git a/l3kernel/testfiles/m3seq005.lvt b/l3kernel/testfiles/m3seq005.lvt
index ec2c07a..94fe942 100644
--- a/l3kernel/testfiles/m3seq005.lvt
+++ b/l3kernel/testfiles/m3seq005.lvt
@@ -1,5 +1,5 @@
%
-% Copyright (C) 2011,2012 The LaTeX3 Project
+% Copyright (C) 2011,2012,2018 The LaTeX3 Project
%
\documentclass{minimal}
\input{regression-test}
@@ -23,6 +23,13 @@
\test:f { \seq_count:N \l_foo_seq }
\tl_map_inline:nn {a{b{cd}~}e\fg} { \seq_push:Nn \l_foo_seq {#1} }
\test:f { \seq_count:N \l_foo_seq }
+ \cs_set_protected:Npn \test_aux:n #1
+ {
+ \seq_set_from_function:NnN \l_foo_seq
+ { \int_step_function:nN {#1} } \use:n
+ \int_compare:nNnF { \seq_count:N \l_foo_seq } = {#1} { \ERROR }
+ }
+ \int_step_function:nnN { 0 } { 17 } \test_aux:n
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
More information about the latex3-commits
mailing list