aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Gross2019-11-25 00:47:13 -0500
committerJason Gross2019-11-25 00:47:39 -0500
commitf269ffd88b6a725d8f8f6a7bf1e91799b361a31f (patch)
tree7416778cecaa4db37048dd6f18e6e2e4001058fa
parent7177a6f76e74eb6e97c634bad484027bf94979bd (diff)
Add a complexity test for `pattern`
This is to hopefully prevent regressions on https://github.com/coq/coq/issues/11150 and https://github.com/coq/coq/issues/6502.
-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..14e388cd75
--- /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 Append "-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.