Beingamanforever

median.m benchmarking branch vs branchless

Jan 27th, 2026
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 0.95 KB | None | 0 0
  1. function bench_mid_two_vals ()
  2.  
  3.   N = 1e7;
  4.   m1 = int64 (randi (100, 1, N));
  5.   m2 = int64 (randi (100, 1, N));
  6.   samesign = sign (m1) == sign (m2);
  7.  
  8.   f_branchless = @() ...
  9.     (samesign .* (m1 + (m2 - m1) / 2) + !samesign .* ((m1 + m2) / 2));
  10.  
  11.   f_masked = @() masked_impl (m1, m2, samesign);
  12.  
  13.   % warmup
  14.   for i = 1:5
  15.     f_branchless ();
  16.     f_masked ();
  17.   end
  18.  
  19.   runs = 20;
  20.   t1 = zeros (1, runs);
  21.   t2 = zeros (1, runs);
  22.  
  23.   for i = 1:runs
  24.     tic; f_branchless (); t1(i) = toc;
  25.     tic; f_masked ();    t2(i) = toc;
  26.   end
  27.  
  28.   printf ("Branchless: %.3f ms\n", mean (t1)*1000);
  29.   printf ("Masked:     %.3f ms\n", mean (t2)*1000);
  30.   printf ("Speedup (masked / branchless): %.2fx\n", mean (t2)/mean (t1));
  31.  
  32. endfunction
  33.  
  34.  
  35. function m = masked_impl (m1, m2, samesign)
  36.   m = zeros (size (m1), "like", m1);
  37.   m(samesign) = m1(samesign) + (m2(samesign) - m1(samesign)) / 2;
  38.   m(!samesign) = (m1(!samesign) + m2(!samesign)) / 2;
  39. endfunction
  40.  
Advertisement
Add Comment
Please, Sign In to add comment