[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