Tuesday, July 9, 2013

Performa indeks dalam mengganti logika if di MATLAB

Posting ini berkaitan dengan posting saya sebelumnya yakni tentang vektorisasi molekular dinamik di MATLAB:
yang sampai saat ini masih menyisakan pertanyaan besar di kepala saya. Antara lain, mengapa vektorisasi justru membutuhkan waktu lebih lama, serta yang kedua, entah kenapa simulasinya g sesuai dengan yang diharapkan: terjadi kolaps setelah waktu tertentu dan perpindahan posisi yang cukup lambat ketimbang companion-nya yang dibuat di java [1]. Dalam menyelidiki masalah ini saya sekali lagi pengen menunjukin kenapa vektorisasi itu penting di MATLAB dan sebisa mungkin kita harus menghindari loop dalam menulis program di MATLAB.

Oleh karena itu saudara bisa menyimak listing berikut

clc;
X = 5*randi(10,10);
disp(X);
[baris,kolom] = size(X);
index2 = zeros(baris, kolom);
index1 = zeros(baris, kolom);
index = mod(X(:,:) , 3) >0 ;
index1(index) = 2;
index1(~index) = 1;
for i=1:baris,
for j=1:kolom,
if mod(X(i,j),3) > 0;
index2(i,j) = 2;
else
index2(i,j) = 1;
end
end
end
disp('indeks 1');
disp(index1);
disp('indeks 2');
disp(index2);
% sample output:
%
% 10 10 50 30 25 35 10 20 40 45
% 15 45 20 20 10 20 15 20 40 5
% 20 40 50 25 15 30 25 40 40 10
% 5 35 20 5 25 40 45 5 40 15
% 15 10 15 30 30 50 10 25 20 10
% 10 5 25 20 15 25 10 40 30 40
% 20 15 15 50 50 45 20 40 10 30
% 35 50 10 40 20 10 40 30 10 25
% 20 45 50 40 30 5 30 45 15 35
% 15 45 40 30 15 25 30 15 25 40
%
% indeks 1
% 2 2 2 1 2 2 2 2 2 1
% 1 1 2 2 2 2 1 2 2 2
% 2 2 2 2 1 1 2 2 2 2
% 2 2 2 2 2 2 1 2 2 1
% 1 2 1 1 1 2 2 2 2 2
% 2 2 2 2 1 2 2 2 1 2
% 2 1 1 2 2 1 2 2 2 1
% 2 2 2 2 2 2 2 1 2 2
% 2 1 2 2 1 2 1 1 1 2
% 1 1 2 1 1 2 1 1 2 2
%
% indeks 2
% 2 2 2 1 2 2 2 2 2 1
% 1 1 2 2 2 2 1 2 2 2
% 2 2 2 2 1 1 2 2 2 2
% 2 2 2 2 2 2 1 2 2 1
% 1 2 1 1 1 2 2 2 2 2
% 2 2 2 2 1 2 2 2 1 2
% 2 1 1 2 2 1 2 2 2 1
% 2 2 2 2 2 2 2 1 2 2
% 2 1 2 2 1 2 1 1 1 2
% 1 1 2 1 1 2 1 1 2 2
view raw tes_index.m hosted with ❤ by GitHub
Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.

% uji performa
function tes_index2()
clear all;
clc;
tic ;
test;
disp(['waktu eksekusi ' num2str(toc)]); % ternyata ini dihitung pada processor yang satunya :D
function test
X = 5*randi(1000,1000);
[baris,kolom] = size(X);
time1 = 0;
time2 = 0;
index2 = zeros(baris, kolom);
index1 = zeros(baris, kolom);
for m=1:100,
tic;
index = mod(X(:,:) , 3) >0 ; % cara 1
index1(index) = 2;
index1(~index) = 1;
time1 = time1 + toc;
tic;
for i=1:baris, % cara 2
for j=1:kolom,
if mod(X(i,j),3) > 0;
index2(i,j) = 2;
else
index2(i,j) = 1;
end
end
end
time2 = time2 + toc;
end
disp(['lama cara 1 = ', num2str(time1)]);
disp(['lama cara 2 = ', num2str(time2)]);
% sample output:
%
% lama cara 1 = 11.4248
% lama cara 2 = 21.4954
% waktu eksekusi 0.2534
view raw tes_index2.m hosted with ❤ by GitHub
Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.

Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya  ditempatkan pada core processor yang berbeda seperti  sudah saya komentari pada listing di atas.


1. Ternyata perintah axis manual di MATLAB hanya berlaku ketika ada perintah  hold on.