Skip to content

Conversation

@Bumblebee00
Copy link
Contributor

In terms of performance the two biggest problem of rule macro are:

  • creating the rule object: calls recursively a lor of functions that return other functions (that are closures)
  • type inference: first time executing the rule takes some time

So i tought of a simpler approach: instead of creating the a rule object we just store the quoted expression, and then we check if it's equal to the input expression with a simple recursive function. And problem 1 goes away. For problem 2 I tried to write this recursive function specifying the types but I am not sure I made it corrrectly. I made a test in wich 100 rules are created and 100 random expressions are compared to the rules, both using the old @ rule macro and this new approach, and it seems 25 times faster.

@github-actions
Copy link
Contributor

github-actions bot commented Nov 11, 2025

Benchmark Results (Julia vlts)

Time benchmarks
master 366fd3e... master / 366fd3e...
arithmetic/addition 0.0752 ± 0.00088 ms 0.076 ± 0.00099 ms 0.989 ± 0.017
arithmetic/division 28.3 ± 0.69 μs 30 ± 0.85 μs 0.941 ± 0.035
arithmetic/multiplication 0.06 ± 0.0016 ms 0.0636 ± 0.0017 ms 0.943 ± 0.035
overhead/acrule/a+2 2.73 ± 0.051 μs 2.85 ± 0.061 μs 0.961 ± 0.027
overhead/acrule/a+2+b 0.07 ± 0 μs 0.07 ± 0 μs 1 ± 0
overhead/acrule/a+b 4.89 ± 0.11 μs 5.13 ± 0.12 μs 0.953 ± 0.031
overhead/acrule/noop:Int 0.05 ± 0.01 μs 0.05 ± 0.01 μs 1 ± 0.28
overhead/acrule/noop:Sym 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/get_degrees/large_poly 0.0994 ± 0.0039 s 0.103 ± 0.004 s 0.968 ± 0.054
overhead/rule/noop:Int 0.07 ± 0 μs 0.07 ± 0 μs 1 ± 0
overhead/rule/noop:Sym 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/rule/noop:Term 0.06 ± 0.01 μs 0.06 ± 0.01 μs 1 ± 0.24
overhead/ruleset/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/ruleset/noop:Sym 0.31 ± 0.01 μs 0.301 ± 0.01 μs 1.03 ± 0.048
overhead/ruleset/noop:Term 1.2 ± 0.02 μs 1.21 ± 0.029 μs 0.992 ± 0.029
overhead/simplify/noop:Int 30 ± 0 ns 30 ± 0 ns 1 ± 0
overhead/simplify/noop:Sym 30 ± 10 ns 30 ± 10 ns 1 ± 0.47
overhead/simplify/noop:Term 0.0324 ± 0.00095 ms 0.0331 ± 0.0013 ms 0.977 ± 0.047
overhead/simplify/randterm (+, *):serial 0.259 ± 0.0057 s 0.27 ± 0.0058 s 0.959 ± 0.029
overhead/simplify/randterm (+, *):thread 0.323 ± 0.15 s 0.322 ± 0.11 s 1 ± 0.58
overhead/simplify/randterm (/, *):serial 0.0907 ± 0.0021 ms 0.0939 ± 0.0021 ms 0.965 ± 0.031
overhead/simplify/randterm (/, *):thread 0.0941 ± 0.0019 ms 0.0962 ± 0.0021 ms 0.978 ± 0.029
overhead/substitute/a 0.0509 ± 0.0011 ms 0.0501 ± 0.0012 ms 1.02 ± 0.033
overhead/substitute/a,b 0.0638 ± 0.0014 ms 0.0624 ± 0.0013 ms 1.02 ± 0.03
overhead/substitute/a,b,c 0.0579 ± 0.0012 ms 0.0558 ± 0.0014 ms 1.04 ± 0.034
polyform/easy_iszero 23.2 ± 0.45 μs 23.8 ± 0.5 μs 0.974 ± 0.028
polyform/isone 1.07 ± 0.027 ms 1.09 ± 0.02 ms 0.981 ± 0.031
polyform/isone:noop 0.15 ± 0.001 μs 0.231 ± 0.01 μs 0.649 ± 0.028
polyform/iszero 0.909 ± 0.024 ms 0.926 ± 0.015 ms 0.981 ± 0.03
polyform/iszero:noop 0.15 ± 0.01 μs 0.23 ± 0.01 μs 0.652 ± 0.052
polyform/simplify_fractions 1.18 ± 0.03 ms 1.21 ± 0.026 ms 0.98 ± 0.032
time_to_load 1.17 ± 0.0046 s 1.18 ± 0.0094 s 0.994 ± 0.0088
Memory benchmarks
master 366fd3e... master / 366fd3e...
arithmetic/addition 0.438 k allocs: 16 kB 0.438 k allocs: 16 kB 1
arithmetic/division 0.198 k allocs: 6.89 kB 0.198 k allocs: 6.89 kB 1
arithmetic/multiplication 0.357 k allocs: 11.7 kB 0.357 k allocs: 11.7 kB 1
overhead/acrule/a+2 0.037 k allocs: 1.29 kB 0.037 k allocs: 1.29 kB 1
overhead/acrule/a+2+b 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/a+b 0.053 k allocs: 1.88 kB 0.053 k allocs: 1.88 kB 1
overhead/acrule/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/acrule/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/get_degrees/large_poly 0.712 M allocs: 20.6 MB 0.712 M allocs: 20.6 MB 1
overhead/rule/noop:Int 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Sym 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/rule/noop:Term 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
overhead/ruleset/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/ruleset/noop:Sym 3 allocs: 0.109 kB 3 allocs: 0.109 kB 1
overhead/ruleset/noop:Term 12 allocs: 0.391 kB 12 allocs: 0.391 kB 1
overhead/simplify/noop:Int 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Sym 0 allocs: 0 B 0 allocs: 0 B
overhead/simplify/noop:Term 0.388 k allocs: 14.4 kB 0.388 k allocs: 14.4 kB 1
overhead/simplify/randterm (+, *):serial 2.96 M allocs: 0.106 GB 2.96 M allocs: 0.106 GB 1
overhead/simplify/randterm (+, *):thread 2.96 M allocs: 0.263 GB 2.96 M allocs: 0.263 GB 1
overhead/simplify/randterm (/, *):serial 0.869 k allocs: 30.8 kB 0.869 k allocs: 30.8 kB 1
overhead/simplify/randterm (/, *):thread 0.894 k allocs: 31.5 kB 0.894 k allocs: 31.5 kB 1
overhead/substitute/a 0.308 k allocs: 11 kB 0.308 k allocs: 11 kB 1
overhead/substitute/a,b 0.394 k allocs: 13.9 kB 0.394 k allocs: 13.9 kB 1
overhead/substitute/a,b,c 0.355 k allocs: 12.1 kB 0.355 k allocs: 12.1 kB 1
polyform/easy_iszero 0.146 k allocs: 4.92 kB 0.146 k allocs: 4.92 kB 1
polyform/isone 9.22 k allocs: 0.589 MB 9.22 k allocs: 0.589 MB 1
polyform/isone:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/iszero 7.58 k allocs: 0.484 MB 7.58 k allocs: 0.484 MB 1
polyform/iszero:noop 2 allocs: 32 B 2 allocs: 32 B 1
polyform/simplify_fractions 10.3 k allocs: 0.627 MB 10.3 k allocs: 0.627 MB 1
time_to_load 0.153 k allocs: 14.5 kB 0.153 k allocs: 14.5 kB 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant