Tampilkan postingan dengan label kompleksitas kode. Tampilkan semua postingan
Tampilkan postingan dengan label kompleksitas kode. Tampilkan semua postingan

Kamis, 31 Desember 2015

PHP - Kompleksitas Kode untuk Keluaran


PHP merupakan salah satu bahasa yang sangat populer di Indonesia. Dan tulisan ini saya buat untuk semua kalangan developer yang memcari efisiensi penulisan kode serta kompleksitasnya sehingga waktu eksekusi dapat dioptimalkan.

Data yang saya dapat berasal dari hasil melakukan eksperimen dengan bantuan alat PHP Profiler. Adapun yang saya gunakan yaitu Blackfire. Setelah melakukan banyak eksperimen dengan function print, printf, dan echo. Dengan pertimbangan banyak aspek tes seperti melakukan keluaran dengan big number (integer) yang terdiri dari 19 digit serta karakter huruf a-z yang terdiri dari 260 karakter.

Apa saja yang akan diuji? Saya akan uji beberapa tipe data seperti integer, string, dan array. Serta manipulasi variable dan mixing data type.

Integer

Untuk tipe data integer, dari hasil tes yang saya lakukan, sebaiknya gunakan print atau printf. Adapun waktu tercepat diperoleh oleh printf dengan beberapa ketentuan. Apakah Anda mengenal data type convertion di dalam bahasa C? Dengan menggunakan itu, kita akan mempercepat eksekusi kode. Caranya sangat mudah, tambahkan saja "(int)" di depan angka yang kita definisikan. Semisal:

$var = (int) 1;

Berbeda jika tanpa (int), kecepatan eksekusi berkurang, kenapa? Saya memiliki hipotesis seperti ini, "Tipe data di dalam PHP asumsikan saja umum, jika kita mendefinisikan tipe data-nya, maka kita mempercepat eksekusi waktunya". Kenapa? Jika tipe data tidak di definisikan, maka PHP akan mendefinisikannya untuk kita sehingga memerlukan waktu lagi. Karena itu, jika tipe data tersebut selalu sama dalam contoh kasus integer, maka tambahkan/gunakan (int) di depannya.
Untuk penggunaan kode-nya, bisa dilihat seperti ini.

print (int) 0123456789;
printf((int) 0123456789);
$var = (int) 0123456789;
print $var;
printf("%d", $var);

String

Berbeda dengan integer, tipe data string memiliki banyak aturan untuk efisiensi eksekusi waktunya. Tapi, secara umum tipe data string sudah cukup cepat jika menggunakan print atau echo. Sama halnya dengan integer yang menggunakan data type convertion (int), string juga akan lebih cepat jika menggunakan (string). Namun, jika menggunakan (string) sebaiknya saat penggunaan kutip satu (') saja. Penjelasan penggunaannya supaya efisien sebagai berikut.

print 'keluaran';
echo 'keluaran'; # sebaiknya gunakan echo
print (string) 'keluaran'; # sebaiknya gunakan print
echo (string) 'keluaran';
print "keluaran";
echo "keluaran"; # sebaiknya gunakan echo

Untuk variabel string, penggunaannya supaya efisien sebagai berikut.

$var = 'keluaran';
print $var;
echo $var; # sebaiknya gunakan echo
$var = "keluaran";
print $var;
echo $var; # sebaiknya gunakan echo
$var = (string) 'keluaran';
print $var;
echo $var; # sebaiknya gunakan echo
$var = (string) "keluaran";
print $var;
echo $var; # sebaiknya gunakan echo

Untuk fungsi printf, gunakan apabila kasusnya seperti ini saja.

$var = "keluaran";
printf("%s", $var);

Kesimpulan untuk tipe data string, sebaiknya gunakan echo saja.

echo 'keluaran'; # jika hanya string tanpa variabel, gunakan kutip satu saja
echo "keluaran $var"; # jika dengan variabel, gunakan kutip dua seperti ini saja

Array

 Tes ini dilakukan dengan array yang total isinya 1.000 index. Ada 2 cara penulisan array, yaitu.

array(...); # dengan function array
[...]; # dengan simbol []

Dari dua cara di atas, sebaiknya gunakan simbol [] untuk mendefinisikan array. Karena penggunaan [] lebih ringan dibandingkan dengan array().
Di dalam bermain array, untuk looping sebaiknya gunakan foreach. Dari hasil tes yang saya lakukan dengan array yang memiliki 1.000 index, function foreach yang memiliki kecepatan tertinggi dalam proses eksekusinya.

Peringatan! foreach yang terbaik apabila hanya digunakan untuk menampilkan data dari array. Namun, jika untuk melakukan modifikasi isi array, tentu saja berbeda.

$array = [0,1,2,3,..,1000]; # array berjumlah 1.000 index
foreach($array as $value) ...; # jika hanya ingin mengambil isi array
foreach($array as $key=>$value) ...; # jika ingin mengambil index serta isi array
# untuk mengambil index/keys pada array lalu melakukan manipulasi, sebaiknya gunakan
$keys = array_keys($array);
foreach($array as $value) lebih cepat dibandingkan dengan foreach([...] as $value)

Kesimpulan untuk tipe data array, dalam kebutuhan untuk keluaran, foreach merupakan yang terbaik. Untuk kecepatan, foreach($var as $new_var) lebih cepat dibandingkan dengan foreach([1,2,3,..,n] as $new_var).

Kesimpulan

Berbeda tipe data juga berbeda penanganannya untuk keluaran. Untuk int, print merupakan pilihan terbaik. Namun untuk str, echo-lah yang terbaik. Sementara untuk array, foreach lebih baik daripada penggunaan for dan while dalam kasus looping.

Penutup

Tulisan yang membahas kompleksitas serta efisiensi penulisan kode untuk PHP ini telah selesai. Tulisan yang dibuat bisa saja terdapat kesalahan, maka dari itu apabila menemukan kesalahan pada tulisan ini, saya berharap dapat dikoreksi bersama. Bukan bermaksud menggurui, saya hanya berbagi pengalaman yang saya dapatkan. Terima kasih.

Free Pascal - Tips untuk Kode yang Lebih Baik


Di dalam bahasa pemrograman apapun, dikenal dengan faster code dan smaller code. Adapun tujuannya yaitu untuk mendapatkan kompleksitas kode yang baik sehingga ukuran kode ringan serta cepat. Berikut ini tips yang diberikan langsung oleh Michaël Van Canneyt yang merupakan pembuat buku referensi untuk Free Pascal Programmers.

Better Algorithm

Di dalam penyelesaiannya kasus-kasus dengan Free Pascal, tentu dapat dilakukan dengan banyak cara. Semisal yang satu dengan yang lainnya berbeda dalam penyelesaian kasus 1. Dimana si A melakukannya dengan if statement sementara si B menggunakan switch-case atau case-of. Dan tentu saja kompleksitas-nya berbeda-beda tergantung dari kasus serta penulisan kode.
Semisal, ada kasus, identifikasi bilangan lalu cetak apakah itu satuan, puluhan, ratusan, atau ribuan. Dalam hal ini, mulai lah si A dan si B menulis sebuah program.

Si A:

program Identifikasi;
var i: Integer;
begin
  i := 1030;
  if i < 9 then writeln('satuan')
    else if i < 99 then writeln('puluhan')
      else if i < 999 then writeln('ratusan')
        else writeln('ribuan');
end.
Si B:

program Identifikasi;
var i: Integer;
begin
  i := 1030;
  case i of
    0..9: writeln('satuan');
    10..99: writeln('puluhan');
    100..999: writeln('ratusan');
    else
      writeln('ribuan');
  end;
end.
Kedua program tersebut hasilnya akan sama. Namun mana yang lebih baik dan lebih cepat? Dari segi kompleksitas kode, tentu saja lebih baik si B. Jadi, mulai lah mempelajari tentang kompleksitas kode dan terapkan ke dalam kode yang kita tulis. Cari penyelesaian kasus dengan algoritma yang terbaik.

Tilik Processor Dependency

Setiap processor, misal i386 atau amd64, memiliki keunggulan dan kekurangan masing-masing. Itu semua berpengaruh kepada variabel (tipe data) yang akan kita pilih. Semisal, kita menggunakan Free Pascal dengan processor amd64 (64-bit). Maka, longword dan longint direkomendasikan sebagai pilihan terbaik.

Larangan

Penulis yang memberi tips ini mengatakan bahwa ansistrings, widestrings, dan exception support membutuhkan lebih banyak resource yang membuat code over-head. Selain itu, penggunaan cdecl modifier juga tidak disarankan.

Bermain dengan FPC

FPC (Free Pascal Compiler) memiliki banyak optional parameter yang dapat dimanfaatkan untuk kebutuhan seperti ini. Untuk menganalisis kode kita, fpc mendukung paramter -pg untuk mencari mana yang menghabiskan banyak resource. Kemudian, kita dapat mengubahnya ke bahasa assembly supaya mendapatkan hasil yang optimal. Selain itu, kita disarankan untuk menggunakan parameter -Og pada fpc.

Penutup

Masih banyak cara yang dapat digunakan untuk menghemat resource serta mempercepat kode. Namun, karena keterbatasan ilmu saya sehingga saat ini hanya tulisan ini yang dapat mewakili. Saya hanyalah manusia biasa yang mencoba untuk menjadi penulis. Jika ada kesalahan mohon dikoreksi dan kemudian akan saya perbaiki. Terima kasih.