Instance vs local variable performance
Karna tulisan ini ditulis di weekday, jadi tulisan ini mungkin akan sangat singkat :)
Jika anda sudah membaca tulisan saya sebelumnya yang berjudul Tips saat menulis private method mungkin anda sudah tahu kalo saya sangat-sangat menyarankan menggunakan local variable dibanding instance variable pada program anda tulis.
Disana saya menyarankan anda membuat fitur dengan membaginya menjadi function-function kecil dan bukan prosedur-prosedur. Prosedur disini maksud saya function yang tidak membalikan data, sedangkan “function” adalah function yang membalikan data.
Pada buku Code Complete juga menyarankan ini:
Keep Variables “Live” for as Short a Time as Possible
Jika anda menyelesaikan masalah dengan menggunakan instance variable otomatis variable tersebut akan terus hidup sampai main function anda selesai dipanggil.
Tapi untuk tulisan kali ini saya ingin ngobrol tentang performancenya bukan dari sisi desainnya. Mungkin dari sisi design bisa saya buat lagi di tulisan yang lain :)
Terinspirasi dari tulisan yang udah lumayan lama dipublish oleh Aaron yang berjudul Instance Variable Performance saya jadi melakukan benchmarking kecil-kecilan juga tentang perbedaan penggunakan instance vs local variable.
Kira-kira benchmarking-nya sebagai berikut:
$> cat bench.rb
require 'benchmark'
class Instance
def initialize
@satu = 'satu'
@dua = 'dua'
@tiga = 'tiga'
@empat = 'empat'
@lima = 'lima'
end
end
class Local
def initialize
satu = 'satu'
dua = 'dua'
tiga = 'tiga'
empat = 'empat'
lima = 'lima'
end
end
n = 5_000_000
Benchmark.bm do |x|
x.report { n.times { Instance.new } }
x.report { n.times { Local.new } }
end
$> ruby bench.rb
user system total real
2.535891 0.000405 2.536296 ( 2.536660)
1.428839 0.000010 1.428849 ( 1.429049)
Dapat dilihat dari hasil diatas bahwa secara performa kelas yang menggunakan local variable lebih cepat (1.429049) dibandingkan kelas yang menggunakan instance variable (2.536660).
Saya tidak melarang anda untuk menggunakan instance variable, tapi sebaiknya coba dipikirkan dahulu untuk menggunakan local variable dengan membuat function yang mempunyai kembalian.
Karna menggunakan local variable selain membuat design suatu kelas menjadi mudah untuk dipelihara dan juga dapat meningkatkan performa.
# bad
def call
crete_user
create_organization
create_log_reports
end
# good
def call
user = create_user(@user_param)
organization = create_organization(user, @organization_params)
create_log_reports(user, organization)
end
Terima kasih telah membaca tulisan sederhana ini, semoga tulisan dapat bermamfaat bagi pembaca skalian.
Have a good day~