aboutsummaryrefslogtreecommitdiff
path: root/test-suite/complexity/pattern.v
diff options
context:
space:
mode:
authorHugo Herbelin2019-11-26 21:51:31 +0100
committerHugo Herbelin2019-11-26 21:51:31 +0100
commitaf517095b69d34837b988fa8e6a6615851dd9ca0 (patch)
treee67be6e19bc0a6e629affb96a2d8b201f683ef85 /test-suite/complexity/pattern.v
parentde87f51f4d1de23831c1eced827b91a3628c5dd5 (diff)
parent73bb54d1625ae6eafdb9eb7f2c673fb039150fdb (diff)
Merge PR #11177: Add a complexity test for `pattern`
Reviewed-by: herbelin
Diffstat (limited to 'test-suite/complexity/pattern.v')
-rw-r--r--test-suite/complexity/pattern.v38
1 files changed, 38 insertions, 0 deletions
diff --git a/test-suite/complexity/pattern.v b/test-suite/complexity/pattern.v
new file mode 100644
index 0000000000..fb5bf5a00b
--- /dev/null
+++ b/test-suite/complexity/pattern.v
@@ -0,0 +1,38 @@
+(** Testing the performance of [pattern]. For not regressing on COQBUG(https://github.com/coq/coq/issues/11150) and COQBUG(https://github.com/coq/coq/issues/6502) *)
+(* Expected time < 0.75s *)
+(* reference: 0.673s after adjustment *)
+Definition Let_In {A P} (v : A) (f : forall x : A, P x) : P v
+:= let x := v in f x.
+
+Fixpoint big (a : nat) (sz : nat) : nat
+ := match sz with
+ | O => a
+ | S sz' => Let_In (a * a) (fun a' => big a' sz')
+ end.
+
+Ltac do_time n :=
+ try (
+ once (assert (exists e, e = big 1 n);
+ [ lazy -[big]; (*match goal with |- ?G => idtac G end;*) lazy [big];
+ time pattern Nat.mul, S, O, (@Let_In nat (fun _ => nat))
+ | ]);
+ fail).
+
+Ltac do_time_to n :=
+ lazymatch (eval vm_compute in n) with
+ | O => idtac
+ | ?n' => do_time_to (Nat.div2 n'); idtac n'; do_time n'
+ end.
+
+Local Set Warnings "-abstract-large-number".
+
+(* Don't spend lots of time printing *)
+Notation hide := (_ = _).
+
+Goal True.
+Proof.
+ (* do_time_to 16384. *) (* should be linear, not quadratic *)
+ assert (exists e, e = big 1 16384).
+ lazy -[big]; (*match goal with |- ?G => idtac G end;*) lazy [big].
+ Timeout 15 Time pattern Nat.mul, S, O, (@Let_In nat (fun _ => nat)).
+Abort.