Skip to content

Commit 3c2b8e4

Browse files
committed
Add performance test for rate limiting
1 parent 9dc71a7 commit 3c2b8e4

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as t from "tap";
2+
import { RateLimiter } from "./RateLimiter";
3+
4+
const ttl = 60000; // 1 minute in milliseconds
5+
const keyCount = 50_000;
6+
7+
const keys = Array.from({ length: keyCount }, (_, i) => `user${i}`);
8+
9+
t.test("check performance for first check for a key", async (t) => {
10+
const limiter = new RateLimiter(100_000_000, ttl);
11+
12+
const checkStart = performance.now();
13+
14+
for (const key of keys) {
15+
limiter.isAllowed(key, ttl, 3);
16+
}
17+
18+
const checkEnd = performance.now();
19+
const timePerCheck = (checkEnd - checkStart) / keyCount;
20+
21+
if (timePerCheck > 0.001 /* ms */) {
22+
t.fail(`Performance test failed: ${timePerCheck}ms per check`);
23+
} else {
24+
t.pass(`Performance test passed: ${timePerCheck}ms per check`);
25+
}
26+
});
27+
28+
t.test(
29+
"check performance for second check for a key (still allowed)",
30+
async (t) => {
31+
const limiter = new RateLimiter(100_000_000, ttl);
32+
33+
for (const key of keys) {
34+
limiter.isAllowed(key, ttl, 3);
35+
}
36+
37+
const checkStart = performance.now();
38+
39+
for (const key of keys) {
40+
limiter.isAllowed(key, ttl, 3);
41+
}
42+
43+
const checkEnd = performance.now();
44+
const timePerCheck = (checkEnd - checkStart) / keyCount;
45+
46+
if (timePerCheck > 0.001 /* ms */) {
47+
t.fail(`Performance test failed: ${timePerCheck}ms per check`);
48+
} else {
49+
t.pass(`Performance test passed: ${timePerCheck}ms per check`);
50+
}
51+
}
52+
);
53+
54+
t.test("check performance a blocked key", async (t) => {
55+
const limiter = new RateLimiter(100_000_000, ttl);
56+
57+
for (const key of keys) {
58+
limiter.isAllowed(key, ttl, 2);
59+
limiter.isAllowed(key, ttl, 2);
60+
}
61+
62+
const checkStart = performance.now();
63+
64+
for (const key of keys) {
65+
limiter.isAllowed(key, ttl, 2);
66+
}
67+
68+
const checkEnd = performance.now();
69+
const timePerCheck = (checkEnd - checkStart) / keyCount;
70+
71+
if (timePerCheck > 0.001 /* ms */) {
72+
t.fail(`Performance test failed: ${timePerCheck}ms per check`);
73+
} else {
74+
t.pass(`Performance test passed: ${timePerCheck}ms per check`);
75+
}
76+
});

0 commit comments

Comments
 (0)