function result = perf () result = struct ('name', {}, 't_est', {}, 't_mad', {}); warning off; if exist('OCTAVE_VERSION') == 0 maxNumCompThreads(1); end result(end+1) = timeit ('doubleForLoop/1', @doubleForLoop_nonasgn1, 1); result(end+1) = timeit ('doubleForLoop/a=1', @doubleForLoop_aequal1, 1); result(end+1) = timeit ('doubleForLoop/a=b', @doubleForLoop_aequalb, 1, 1); result(end+1) = timeit ('doubleForLoop/a=a+b', @doubleForLoop_aplusb, 1, 1); result(end+1) = timeit ('doubleForLoop/a=sin(b*i)', @doubleForLoop_asinbi, 2); result(end+1) = timeit ('vectorOfSquares', @vectorOfSquares, 100, 1e3); % mandelbrot assert (sum (sum (mandelperf (true))) == 14791) result(end+1) = timeit('mandel', @mandelperf, true); % recursive fib assert((fib (20)) == 6765) result(end+1) = timeit('fib', @fib, 20); % parse int result(end+1) = timeit('parse_int', @parseintperf, 1000); % numeric vector quicksort assert(issorted(sortperf(5000))) result(end+1) = timeit('quicksort', @sortperf, 5000); % slow pi series s = pisum (true); assert (abs (s - 1.644834071848065) < 1e-12); result(end+1) = timeit('pi_sum', @pisum, true); % random matrix statistics result(end+1) = timeit('rand_mat_stat', @randmatstat, 1000); % largish random number gen & matmul result(end+1) = timeit('rand_mat_mul', @randmatmul, 1000); % printf printfd(1) result(end+1) = timeit('printfd', @printfd, 100000); end function result = timeit (name, func, varargin) lang = 'matlab'; if exist('OCTAVE_VERSION') ~= 0 lang = 'octave'; end nexpt = 20; t = zeros (nexpt, 1); for i = 1:nexpt tic(); func(varargin{:}); t(i) = toc(); end t = t * 1000; t_est = median (t); t_mad = mean (abs (t - t_est)); fprintf ('%s, %s, %.2f ms [%.2f]\n', lang, name, t_est, t_mad); result.name = name; result.t_est = t_est; result.t_mad = t_mad; end function a = doubleForLoop_aplusb (a, b) for i = 1:400, for j = 1:400, a = a + b; end end end function a = doubleForLoop_aequalb (a, b) for i = 1:600, for j = 1:600, a = b; end end end function a = doubleForLoop_aequal1 (a) for i = 1:1000, for j = 1:1000, a = 1; end end end function a = doubleForLoop_nonasgn1 (ignored) for i = 1:800, for j = 1:800, 1; end end end function a = doubleForLoop_asinbi (b) for i = 1:200, for j = 1:200, a = sin (b * j); end end end function vectorOfSquares (nrep, n) for r = 1:nrep x = zeros (1, n); for i = 1:n x(i) = i * i; end end end function sum = pisum(ignore) sum = 0.0; for j=1:500 sum = 0.0; for k=1:10000 sum = sum + 1.0/(k*k); end end end function n = parseintperf(t) for i = 1:t n = randi([0,2^32-1],1,'uint32'); s = dec2hex(n); m = hex2dec(s); assert(m == n); end end function M = mandelperf (ignore) rr = linspace (-2.0, 0.5, 26); ii = linspace (-1.0, 1.0, 21); M = zeros (length (rr), length (ii)); count = 1; for r = rr for i = ii M(count) = mandel(complex(r,i)); count = count + 1; end end end function n = mandel(z) c = z; for n=0:79 if abs(z)>2 return end z = z^2+c; end n = 80; end function b = qsort(a) b = qsort_kernel(a, 1, length(a)); end function a = qsort_kernel(a, lo, hi) i = lo; j = hi; while i < hi pivot = a(floor((lo+hi)/2)); while i <= j while a(i) < pivot, i = i + 1; end while a(j) > pivot, j = j - 1; end if i <= j t = a(i); a(i) = a(j); a(j) = t; i = i + 1; j = j - 1; end end if lo < j; a=qsort_kernel(a, lo, j); end lo = i; j = hi; end end function v = sortperf(n) v = rand(n,1); v = qsort(v); end function s = pisumvec(ignore) a = [1:10000] for j=1:500 s = sum( 1./(a.^2)); end end function [s1, s2] = randmatstat(t) n=5; v = zeros(t,1); w = zeros(t,1); for i=1:t a = randn(n, n); b = randn(n, n); c = randn(n, n); d = randn(n, n); P = [a b c d]; Q = [a b;c d]; v(i) = trace((P.'*P)^4); w(i) = trace((Q.'*Q)^4); end s1 = std(v)/mean(v); s2 = std(w)/mean(w); end function t = mytranspose(x) [m, n] = size(x); t = zeros(n, m); for i=1:n for j=1:m t(i,j) = x(j,i); end end end function X = randmatmul(n) X = rand(n,n)*rand(n,n); end function printfd(n) f = fopen('/dev/null','w'); for i = 1:n fprintf(f, '%d %d\n', i, i); end fclose(f); end