Benchmarks

The benchmarks below were run on Julia version 1.11.5.

Default example

X = [40 30 20 10; 35 50 100 75; 30 80 70 120; 20 30 40 50]
u = [150, 300, 400, 150]
v = [200, 300, 400, 100]
@benchmark ipf(X, [u, v])
BenchmarkTools.Trial: 10000 samples with 1 evaluation per sample.
 Range (minmax):  54.121 μs 12.064 ms   GC (min … max): 0.00% … 99.01%
 Time  (median):     57.718 μs                GC (median):    0.00%
 Time  (mean ± σ):   62.745 μs ± 153.441 μs   GC (mean ± σ):  3.99% ±  1.70%

  ▁▅▅▇██▆▅▄▃▃▂         ▁▁▁▂▁▁▂▁                              ▂
  ███████████████▇▇▆████████████████▇▇▇▆▆▆▅▅▅▂▅▅▅▅▆▄▅▄▂▆▄▅▅▆ █
  54.1 μs       Histogram: log(frequency) by time      92.7 μs <

 Memory estimate: 38.00 KiB, allocs estimate: 813.

Large contingency table

X = reshape(repeat(1:16, 625), 100, 100)
Y = reshape(repeat(1:5, 2000), 100, 100) + X
m = ArrayMargins(Y)
@benchmark ipf(X, m)
BenchmarkTools.Trial: 10000 samples with 1 evaluation per sample.
 Range (minmax):  142.347 μs  5.731 ms   GC (min … max): 0.00% … 14.17%
 Time  (median):     152.916 μs                GC (median):    0.00%
 Time  (mean ± σ):   168.698 μs ± 120.020 μs   GC (mean ± σ):  5.53% ±  9.00%

  █▄▁  ▃▁▁                                                   ▂
  ████████▇▅▄▅▃▁▁▄▁▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄▃▄▄▅▄▃▁▃▄▅▆▄▅▅ █
  142 μs        Histogram: log(frequency) by time        697 μs <

 Memory estimate: 274.31 KiB, allocs estimate: 888.

Six-dimensional contingency table

X = reshape(repeat(1:12, 100), 6, 4, 2, 5, 5)
Y = reshape(repeat(1:5, 240), 6, 4, 2, 5, 5) + X
m = ArrayMargins(Y)
@benchmark ipf(X, m)
BenchmarkTools.Trial: 10000 samples with 1 evaluation per sample.
 Range (minmax):  425.546 μs  9.064 ms   GC (min … max): 0.00% … 94.05%
 Time  (median):     442.598 μs                GC (median):    0.00%
 Time  (mean ± σ):   454.199 μs ± 194.932 μs   GC (mean ± σ):  1.78% ±  3.93%

     ▂▆█▇▃▁ ▃▅▄▃▁                                               
  ▂▃▆████████████▇▅▅▄▅▅▅▅▄▄▄▄▄▄▄▄▃▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▂▂▂▂▂ ▄
  426 μs           Histogram: frequency by time          514 μs <

 Memory estimate: 108.06 KiB, allocs estimate: 1726.