Permalink
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| %% Main function. All the tests are run here. %% | |
| %% The functions declarations can be found at the end. %% | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| function perf() | |
| warning off; | |
| f = fib(20); | |
| assert(f == 6765) | |
| timeit('fib', @fib, 20) | |
| timeit('parse_int', @parseintperf, 1000) | |
| %% array constructors %% | |
| %o = ones(200,200); | |
| %assert(all(o) == 1) | |
| %timeit('ones', @ones, 200, 200) | |
| %assert(all(matmul(o) == 200)) | |
| %timeit('AtA', @matmul, o) | |
| mandel(complex(-.53,.68)); | |
| assert(sum(sum(mandelperf(true))) == 14791) | |
| timeit('mandel', @mandelperf, true) | |
| assert(issorted(sortperf(5000))) | |
| timeit('quicksort', @sortperf, 5000) | |
| s = pisum(true); | |
| assert(abs(s-1.644834071848065) < 1e-12); | |
| timeit('pi_sum',@pisum, true) | |
| %s = pisumvec(true); | |
| %assert(abs(s-1.644834071848065) < 1e-12); | |
| %timeit('pi_sum_vec',@pisumvec, true) | |
| [s1, s2] = randmatstat(1000); | |
| assert(round(10*s1) > 5 && round(10*s1) < 10); | |
| timeit('rand_mat_stat', @randmatstat, 1000) | |
| timeit('rand_mat_mul', @randmatmul, 1000); | |
| printfd(1) | |
| timeit('printfd', @printfd, 100000) | |
| end | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| %% Functions declarations %% | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
| function assert(bool) | |
| if ~bool | |
| error('Assertion failed') | |
| end | |
| end | |
| function timeit(name, func, varargin) | |
| lang = 'matlab'; | |
| if exist('OCTAVE_VERSION') ~= 0 | |
| lang = 'octave'; | |
| end | |
| nexpt = 5; | |
| times = zeros(nexpt, 1); | |
| for i=1:nexpt | |
| tic(); func(varargin{:}); times(i) = toc(); | |
| end | |
| times = sort(times); | |
| fprintf ('%s,%s,%.8f\n', lang, name, times(1)*1000); | |
| end | |
| %% recursive fib %% | |
| function f = fib(n) | |
| if n < 2 | |
| f = n; | |
| return | |
| else | |
| f = fib(n-1) + fib(n-2); | |
| end | |
| end | |
| %% parse int %% | |
| function n = parseintperf(t) | |
| for i = 1:t | |
| n = randi([0,2^32-1],1,'uint32'); | |
| s = sprintf('%08X',n); | |
| m = sscanf(s,'%X'); | |
| assert(m == n); | |
| end | |
| end | |
| %% matmul and transpose %% | |
| %function oo = matmul(o) | |
| % oo = o * o.'; | |
| %end | |
| %% mandelbrot set: complex arithmetic and comprehensions %% | |
| function n = mandel(z) | |
| n = 0; | |
| c = z; | |
| for n=0:79 | |
| if abs(z)>2 | |
| return | |
| end | |
| z = z^2+c; | |
| end | |
| n = 80; | |
| end | |
| function M = mandelperf(ignore) | |
| x=-2.0:.1:0.5; | |
| y=-1:.1:1; | |
| M=zeros(length(y),length(x)); | |
| for r=1:size(M,1) | |
| for c=1:size(M,2) | |
| M(r,c) = mandel(x(c)+y(r)*i); | |
| end | |
| end | |
| end | |
| %% numeric vector quicksort %% | |
| 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 | |
| %% slow pi series %% | |
| 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 | |
| %% slow pi series, vectorized %% | |
| function s = pisumvec(ignore) | |
| a = [1:10000]; | |
| for j=1:500 | |
| s = sum( 1./(a.^2)); | |
| end | |
| end | |
| %% random matrix statistics %% | |
| 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 | |
| %% largish random number gen & matmul %% | |
| function X = randmatmul(n) | |
| X = rand(n,n)*rand(n,n); | |
| end | |
| %% printf %% | |
| function printfd(n) | |
| f = fopen('/dev/null','w'); | |
| for i = 1:n | |
| fprintf(f, '%d %d\n', i, i); | |
| end | |
| fclose(f); | |
| end |