]> Repositorios git - scryer-prolog.git/commitdiff
ENHANCED: use a fast test for the expected case of chars in atom_chars/2 etc.
authorMarkus Triska <[email protected]>
Thu, 24 Apr 2025 16:19:05 +0000 (18:19 +0200)
committerMarkus Triska <[email protected]>
Thu, 24 Apr 2025 16:26:15 +0000 (18:26 +0200)
Suggested by Oleg Finkelstein, thank you a lot!

Example, before this change:

    ?- t+\(length(As, 1_000_000), maplist(=(a), As), time(atom_chars(A, As))).
       % CPU time: 0.693s, 7_000_041 inferences
       true.

Now:

    ?- t+\(length(As, 1_000_000), maplist(=(a), As), time(atom_chars(A, As))).
       % CPU time: 0.080s, 40 inferences
       true.

This also partially ameliorates #2907.

src/lib/builtins.pl

index d553e9b8e21a41e17b33d87c9e0492a7806140fb..8402a89b553642c78d6aba9c731a7f13d22c4d2e 100644 (file)
@@ -1719,20 +1719,27 @@ must_be_number(N, PI) :-
     ).
 
 
-chars_or_vars(Cs, _) :-
+chars_or_vars(Cs, PI) :-
+    (  '$is_partial_string'(Cs) ->
+       % use a fast test for the expected case
+       true
+    ;  chars_or_vars_(Cs, PI)
+    ).
+
+chars_or_vars_(Cs, _) :-
     (  var(Cs) ->
        !
     ;  Cs == [] ->
        !
     ).
-chars_or_vars([C|Cs], PI) :-
+chars_or_vars_([C|Cs], PI) :-
     (  nonvar(C) ->
        (  atom(C),
           atom_length(C, 1) ->
           chars_or_vars(Cs, PI)
        ;  throw(error(type_error(character, C), PI))
        )
-    ;  chars_or_vars(Cs, PI)
+    ;  chars_or_vars_(Cs, PI)
     ).