Commit 654e9227 authored by POTTIER Francois's avatar POTTIER Francois

Added tests [if log] so as to diminish the cost of logging when it is OFF.

I see a 5% performance gain, from 2.0 to 1.9.
If we could remove the tests altogether, we would go down to 1.8.
parent d3d469e6
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
remove ocamldep.wrapper? remove OMakefiles remove ocamldep.wrapper? remove OMakefiles
* Voir si ça coûte cher de stocker la taille de la pile dans * Voir si ça coûte cher de stocker la taille de la pile dans
chaque cellule; voir si les appels à Log coûtent cher chaque cellule
* Could we avoid a special case for the first call to read()? * Could we avoid a special case for the first call to read()?
......
...@@ -69,7 +69,8 @@ module Make (T : TABLE) = struct ...@@ -69,7 +69,8 @@ module Make (T : TABLE) = struct
(* Log the fact that we just entered this state. *) (* Log the fact that we just entered this state. *)
Log.state env.current; if log then
Log.state env.current;
(* If [please_discard] is set, discard a token and fetch the next one. (* If [please_discard] is set, discard a token and fetch the next one.
This is done by jumping to [discard], which itself will jump to This is done by jumping to [discard], which itself will jump to
...@@ -87,8 +88,10 @@ module Make (T : TABLE) = struct ...@@ -87,8 +88,10 @@ module Make (T : TABLE) = struct
and discard env = and discard env =
let triple = env.read() in let triple = env.read() in
let (token, startp, endp) = triple in if log then begin
Log.lookahead_token (T.token2terminal token) startp endp; let (token, startp, endp) = triple in
Log.lookahead_token (T.token2terminal token) startp endp
end;
let env = { env with triple } in let env = { env with triple } in
check_for_default_reduction env check_for_default_reduction env
...@@ -118,7 +121,8 @@ module Make (T : TABLE) = struct ...@@ -118,7 +121,8 @@ module Make (T : TABLE) = struct
let (token, _, _) = env.triple in let (token, _, _) = env.triple in
if token == error_token then begin if token == error_token then begin
Log.resuming_error_handling(); if log then
Log.resuming_error_handling();
error env error env
end end
else else
...@@ -153,7 +157,8 @@ module Make (T : TABLE) = struct ...@@ -153,7 +157,8 @@ module Make (T : TABLE) = struct
(* Log the transition. *) (* Log the transition. *)
Log.shift terminal s'; if log then
Log.shift terminal s';
(* Push a new cell onto the stack, containing the identity of the (* Push a new cell onto the stack, containing the identity of the
state that we are leaving. *) state that we are leaving. *)
...@@ -183,7 +188,8 @@ module Make (T : TABLE) = struct ...@@ -183,7 +188,8 @@ module Make (T : TABLE) = struct
(* Log a reduction event. *) (* Log a reduction event. *)
Log.reduce_or_accept prod; if log then
Log.reduce_or_accept prod;
(* Invoke the semantic action. The semantic action is responsible for (* Invoke the semantic action. The semantic action is responsible for
truncating the stack and pushing a new cell onto the stack, which truncating the stack and pushing a new cell onto the stack, which
......
...@@ -230,6 +230,13 @@ module type TABLE = sig ...@@ -230,6 +230,13 @@ module type TABLE = sig
(* The comments below indicate the conventional messages that correspond (* The comments below indicate the conventional messages that correspond
to these hooks in the code-based back-end; see [CodeBackend]. *) to these hooks in the code-based back-end; see [CodeBackend]. *)
(* If the flag [log] is false, then the logging functions are guaranteed
to do nothing, so it is not necessary to call them. If [log] is true,
the logging functions may or may not have an effect. This flag is
logically superfluous, but saves time in the table-based back-end. *)
val log : bool
module Log : sig module Log : sig
(* State %d: *) (* State %d: *)
......
...@@ -168,6 +168,8 @@ module T = struct ...@@ -168,6 +168,8 @@ module T = struct
next = !stack next = !stack
} }
let log = true
module Log = struct module Log = struct
open Printf open Printf
......
...@@ -102,6 +102,11 @@ module Make (T : TableFormat.TABLES) ...@@ -102,6 +102,11 @@ module Make (T : TableFormat.TABLES)
let semantic_action prod = let semantic_action prod =
T.semantic_action.(prod) T.semantic_action.(prod)
(* If [T.trace] is [None], then the logging functions do nothing. *)
let log =
match T.trace with Some _ -> true | None -> false
module Log = struct module Log = struct
open Printf open Printf
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment