Last active
July 25, 2022 20:55
-
-
Save pgjones/c71d07a5a11bc96326a84fca9e24643b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import choice | |
from string import Formatter | |
from timeit import timeit | |
from werkzeug.routing import Map, Rule | |
from werkzeug.routing.matcher import TableMatcher, TreeMatcher | |
# With thanks to https://github.com/richardolsson/falcon-routing-survey for the paths below | |
PATHS = [ | |
"/", | |
"/events", | |
"/repos/{owner}/{repo}/events", | |
"/repos/{owner}/{repo}/issues/events", | |
"/networks/{owner}/{repo}/events", | |
"/orgs/{org}/events", | |
"/users/{username}/received_events", | |
"/users/{username}/received_events/public", | |
"/users/{username}/events", | |
"/users/{username}/events/public", | |
"/users/{username}/events/orgs/{org}", | |
"/feeds", | |
"/notifications", | |
"/repos/{owner}/{repo}/notifications", | |
"/notifications", | |
"/repos/{owner}/{repo}/notifications", | |
"/notifications/threads/{id}", | |
"/notifications/threads/{id}", | |
"/notifications/threads/{id}/subscription", | |
"/notifications/threads/{id}/subscription", | |
"/repos/{owner}/{repo}/stargazers", | |
"/users/{username}/starred", | |
"/user/starred", | |
"/user/starred/{owner}/{repo}", | |
"/user/starred/{owner}/{repo}", | |
"/user/starred/{owner}/{repo}", | |
"/repos/{owner}/{repo}/subscribers", | |
"/users/{username}/subscriptions", | |
"/user/subscriptions", | |
"/repos/{owner}/{repo}/subscription", | |
"/repos/{owner}/{repo}/subscription", | |
"/repos/{owner}/{repo}/subscription", | |
"/user/subscriptions/{owner}/{repo}", | |
"/user/subscriptions/{owner}/{repo}", | |
"/user/subscriptions/{owner}/{repo}", | |
"/repos/{owner}/{repo}/issues/events/{id}", | |
"/repos/{owner}/{repo}/labels", | |
"/repos/{owner}/{repo}/labels/{name}", | |
"/repos/{owner}/{repo}/labels", | |
"/repos/{owner}/{repo}/labels/{name}", | |
"/repos/{owner}/{repo}/labels/{name}", | |
"/repos/{owner}/{repo}/issues/{number}/labels", | |
"/repos/{owner}/{repo}/issues/{number}/labels", | |
"/repos/{owner}/{repo}/issues/{number}/labels/{name}", | |
"/repos/{owner}/{repo}/issues/{number}/labels", | |
"/repos/{owner}/{repo}/issues/{number}/labels", | |
"/repos/{owner}/{repo}/milestones/{number}/labels", | |
"/repos/{owner}/{repo}/milestones", | |
"/repos/{owner}/{repo}/milestones/{number}", | |
"/repos/{owner}/{repo}/milestones", | |
"/repos/{owner}/{repo}/milestones/{number}", | |
"/repos/{owner}/{repo}/milestones/{number}", | |
"/emojis", | |
"/gitignore/templates", | |
"/gitignore/templates/{language}", | |
"/markdown", | |
"/markdown/raw", | |
"/meta", | |
"/rate_limit", | |
"/user/orgs", | |
"/users/{username}/orgs", | |
"/orgs/{org}", | |
"/orgs/{org}", | |
"/orgs/{org}/members", | |
"/orgs/{org}/members/{username}", | |
"/orgs/{org}/members/{username}", | |
"/orgs/{org}/public_members", | |
"/orgs/{org}/public_members/{username}", | |
"/orgs/{org}/public_members/{username}", | |
"/orgs/{org}/public_members/{username}", | |
"/user/memberships/orgs", | |
"/user/memberships/orgs/{org}", | |
"/user/memberships/orgs/{org}", | |
"/orgs/{org}/teams", | |
"/teams/{id}", | |
"/orgs/{org}/teams", | |
"/teams/{id}", | |
"/teams/{id}", | |
"/teams/{id}/members", | |
"/teams/{id}/members/{username}", | |
"/teams/{id}/members/{username}", | |
"/teams/{id}/members/{username}", | |
"/teams/{id}/memberships/{username}", | |
"/teams/{id}/memberships/{username}", | |
"/teams/{id}/memberships/{username}", | |
"/teams/{id}/repos", | |
"/teams/{id}/repos/{owner}/{repo}", | |
"/teams/{id}/repos/{org}/{repo}", | |
"/teams/{id}/repos/{owner}/{repo}", | |
"/user/teams", | |
"/orgs/{org}/hooks", | |
"/orgs/{org}/hooks/{id}", | |
"/orgs/{org}/hooks", | |
"/orgs/{org}/hooks/{id}", | |
"/orgs/{org}/hooks/{id}/pings", | |
"/orgs/{org}/hooks/{id}", | |
"/repos/{owner}/{repo}/pulls", | |
"/repos/{owner}/{repo}/pulls/{number}", | |
"/repos/{owner}/{repo}/pulls", | |
"/repos/{owner}/{repo}/pulls/{number}", | |
"/repos/{owner}/{repo}/pulls/{number}/commits", | |
"/repos/{owner}/{repo}/pulls/{number}/files", | |
"/repos/{owner}/{repo}/pulls/{number}/merge", | |
"/repos/{owner}/{repo}/pulls/{number}/merge", | |
"/repos/{owner}/{repo}/pulls/{number}/comments", | |
"/repos/{owner}/{repo}/pulls/comments", | |
"/repos/{owner}/{repo}/pulls/comments/{number}", | |
"/repos/{owner}/{repo}/pulls/{number}/comments", | |
"/repos/{owner}/{repo}/pulls/comments/{number}", | |
"/repos/{owner}/{repo}/pulls/comments/{number}", | |
"/user/repos", | |
"/users/{username}/repos", | |
"/orgs/{org}/repos", | |
"/repositories", | |
"/user/repos", | |
"/orgs/{org}/repos", | |
"/repos/{owner}/{repo}", | |
"/repos/{owner}/{repo}", | |
"/repos/{owner}/{repo}/contributors", | |
"/repos/{owner}/{repo}/languages", | |
"/repos/{owner}/{repo}/teams", | |
"/repos/{owner}/{repo}/tags", | |
"/repos/{owner}/{repo}/branches", | |
"/repos/{owner}/{repo}/branches/{branch}", | |
"/repos/{owner}/{repo}", | |
"/repos/{owner}/{repo}/collaborators", | |
"/repos/{owner}/{repo}/collaborators/{username}", | |
"/repos/{owner}/{repo}/collaborators/{username}", | |
"/repos/{owner}/{repo}/collaborators/{username}", | |
"/repos/{owner}/{repo}/comments", | |
"/repos/{owner}/{repo}/commits/{ref}/comments", | |
"/repos/{owner}/{repo}/commits/{sha}/comments", | |
"/repos/{owner}/{repo}/comments/{id}", | |
"/repos/{owner}/{repo}/comments/{id}", | |
"/repos/{owner}/{repo}/comments/{id}", | |
"/repos/{owner}/{repo}/commits", | |
"/repos/{owner}/{repo}/commits/{sha}", | |
"/repos/{owner}/{repo}/compare/{base}...{head}", | |
"/repos/{owner}/{repo}/compare/{user1}:{branch1}...{user2}:{branch2}", | |
"/repos/{owner}/{repo}/readme", | |
"/repos/{owner}/{repo}/contents/{path}", | |
"/repos/{owner}/{repo}/contents/{path}", | |
"/repos/{owner}/{repo}/contents/{path}", | |
"/repos/{owner}/{repo}/contents/{path}", | |
"/repos/{owner}/{repo}/{archive}_format/{ref}", | |
"/repos/{owner}/{repo}/keys", | |
"/repos/{owner}/{repo}/keys/{id}", | |
"/repos/{owner}/{repo}/keys", | |
"/repos/{owner}/{repo}/keys/{id}", | |
"/repos/{owner}/{repo}/deployments", | |
"/repos/{owner}/{repo}/deployments", | |
"/repos/{owner}/{repo}/deployments/{id}/statuses", | |
"/repos/{owner}/{repo}/deployments/{id}/statuses", | |
"/repos/{owner}/{repo}/downloads", | |
"/repos/{owner}/{repo}/downloads/{id}", | |
"/repos/{owner}/{repo}/downloads/{id}", | |
"/repos/{owner}/{repo}/forks", | |
"/repos/{owner}/{repo}/forks", | |
"/repos/{owner}/{repo}/hooks", | |
"/repos/{owner}/{repo}/hooks/{id}", | |
"/repos/{owner}/{repo}/hooks", | |
"/repos/{owner}/{repo}/hooks/{id}", | |
"/repos/{owner}/{repo}/hooks/{id}/tests", | |
"/repos/{owner}/{repo}/hooks/{id}/pings", | |
"/repos/{owner}/{repo}/hooks/{id}", | |
"/repos/{owner}/{repo}/merges", | |
"/repos/{owner}/{repo}/pages", | |
"/repos/{owner}/{repo}/pages/builds", | |
"/repos/{owner}/{repo}/pages/builds/latest", | |
"/repos/{owner}/{repo}/releases", | |
"/repos/{owner}/{repo}/releases/{id}", | |
"/repos/{owner}/{repo}/releases", | |
"/repos/{owner}/{repo}/releases/{id}", | |
"/repos/{owner}/{repo}/releases/{id}", | |
"/repos/{owner}/{repo}/releases/{id}/assets", | |
"/repos/{owner}/{repo}/releases/assets/{id}", | |
"/repos/{owner}/{repo}/releases/assets/{id}", | |
"/repos/{owner}/{repo}/releases/assets/{id}", | |
"/repos/{owner}/{repo}/stats/contributors", | |
"/repos/{owner}/{repo}/stats/commit_activity", | |
"/repos/{owner}/{repo}/stats/code_frequency", | |
"/repos/{owner}/{repo}/stats/participation", | |
"/repos/{owner}/{repo}/stats/punch_card", | |
"/repos/{owner}/{repo}/statuses/{sha}", | |
"/repos/{owner}/{repo}/commits/{ref}/statuses", | |
"/repos/{owner}/{repo}/commits/{ref}/status", | |
"/search/repositories", | |
"/search/code", | |
"/search/issues", | |
"/search/users", | |
"/users/{username}", | |
"/user", | |
"/user", | |
"/users", | |
"/user/emails", | |
"/user/emails", | |
"/user/emails", | |
"/users/{username}/followers", | |
"/user/followers", | |
"/users/{username}/following", | |
"/user/following", | |
"/user/following/{username}", | |
"/users/{username}/following/{target}_user", | |
"/user/following/{username}", | |
"/user/following/{username}", | |
"/users/{username}/keys", | |
"/user/keys", | |
"/user/keys/{id}", | |
"/user/keys", | |
"/user/keys/{id}", | |
"/users/{username}/site_admin", | |
"/users/{username}/site_admin", | |
"/users/{username}/suspended", | |
"/users/{username}/suspended", | |
"/enterprise/stats/{type}", | |
"/enterprise/settings/license", | |
"/staff/indexing_jobs", | |
"/setup/api/start", | |
"/setup/api/upgrade", | |
"/setup/api/configcheck", | |
"/setup/api/configure", | |
"/setup/api/settings", | |
"/setup/api/settings", | |
"/setup/api/maintenance", | |
"/setup/api/maintenance", | |
"/setup/api/settings/authorized-keys", | |
"/setup/api/settings/authorized-keys", | |
"/setup/api/settings/authorized-keys", | |
] | |
tree_map = Map() | |
tree_map._matcher = TreeMatcher() | |
table_map = Map() | |
table_map._matcher = TableMatcher() | |
for path in PATHS: | |
tree_map.add(Rule(path.replace("{", "<").replace("}", ">"), endpoint="a", methods=["GET"])) | |
table_map.add(Rule(path.replace("{", "<").replace("}", ">"), endpoint="a", methods=["GET"])) | |
tree_adapter = tree_map.bind("example.org", "/") | |
table_adapter = table_map.bind("example.org", "/") | |
def match(adapter, test_path): | |
adapter.match(test_path) | |
def main(): | |
print(f"{'Path'.ljust(70)} | Ratio (new/original)") | |
times = 10_000 | |
for _ in range(20): | |
path = choice(PATHS) | |
names = [fn for _, fn, _, _ in Formatter().parse(path) if fn is not None] | |
test_path = path.format(**{name: "abc" for name in names}) | |
tree_time = timeit("match(tree_adapter, test_path)", globals=globals() | {"test_path": test_path}, number=times) | |
table_time = timeit("match(table_adapter, test_path)", globals=globals() | {"test_path": test_path}, number=times) | |
print(f"{path.ljust(70)} | {tree_time / table_time:.2f}") | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment