hakimrie

See also: Other Geeks@INDC

March 2008 - Posts

F# vs C# (on Collatz Conjecture)

Bagi penggemar C# (termasuk saya nih), maukah anda berpindah ke F# ? ok lah, maksud saya menambah koleksi kemampuan bahasa pemrograman di CV, dengan F#? hmmm...; topik postingan saya kali ini sebenarnya saya curi dari blog coding experiments, jadi di blog itu si empunya hendak membandingkan performansi F# dengan C# (menurut saya ini belum cukup fair sih, mengingat F# masih dalam tahap research) untuk melakukan operasi yang merupakan Collatz Problem seperti ini:  untuk sebarang bilangan bulat positif,

  1. jika bilangan tersebut adalah genap, bagi dengan 2
  2. jika bilangan tersebut ganjil, kali tiga dan tambah satu

seperti ini notasinya:

  image

sebenarnya permasalahannya adalah untuk membuktikan bahwa untuk sembarang bilangan bulat positif tersebut, akan selalu berakhir pada bilangan yang sama (1) dengan persamaan di atas ($500 bagi yang bisa membuktikan persamaan tersebut selalu berakhir di 1 untuk semua bilangan bulat positif). jadi kalau misalnya ada masukan angka 7, maka akan dihasilkan 7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 ->1, pertanyaanya bilangan berapa (yang merupakan bilangan di bawah sejuta) yang akan menghasilkan rantai eksekusi terpanjang?

kemudian dia menanyakannya kepada sebuah mesin bernama komputer, karena dia nggak bisa bahasa mesin, maka dia memanfaatkan jasa 2 orang interpreter/penerjemah, karena si dia memang menguasai dua bahasa berbeda, dan masing - masing penerjemah ini bisa bahasa mesin (halah..ngelantunr gini), ya akhirnya dia bertanya pada penerjemah pertama, bahasa pertama yang digunakannya adalah dengan bahasa prancis yang indah, eh maksud saya F# yang elegan, dan kepada penerjemah yang kedua adalah bahasa jawa ngoko alus, kalau boleh mengandaikan c/c++ adalah ngoko-nya :P, yaitu C# (FYI: ngoko alus masih di bawah kromo). monggo, kito persani (mari, kita lihat)

1. F# yang elegan ( 18 loc)

image

saya menggunakan cara yang sama baik untuk F# maupun C# dalam mendapatkan data waktu, yaitu dengan model C#, and then, di run, dan ini dia hasilnya:

image

2. C# (48 loc)

image

and, Boom!

image

kesimpulan, pertama, C# lebih cepat +/- 13 kali dibandingkan  F# dengan menggunakan algoritma seperti di atas, bisa jadi algoritma yang berbeda akan menghasilkan kesimpulan yang berbeda, kedua, jumlah baris kode F# lebih sedikit 2.7 kali lipat dari C# (dengan algoritma seperti di atas). jadi C# lebih baik dari F# nu, hmm... mungkin memang demikian untuk saat ini dari segi performansi, tapi yang perlu menjadi catatan adalah F# masih dalam tahap research, dan di sana ada orang - orang hebat semacam Don Syme yang siap meningkatkan performa F#, disamping itu bukankah jumlah loc yang lebih sedikit memperkecil kemungkinan kesalahan code, dan mempermudah trace code jika terjadi kesalahan. jadi, mau nambah mainan gak? terserah anda! :)

maraji': wiki, coding-experiments

catatan : saya menguji di OS :Windows Vista Business 32-bit; Processor = Intel Pentium Dual-Core T2130 1.86 GHz, RAM : 766 M

Share this post: | | | |
Posted: Mar 29 2008, 04:53 PM by hakimrie | with no comments
Filed under: ,
So, Is It Possible?

aargh..<astaghfirullah>, kenapa saya ini usil sekali, hari ini saya memberikan comment ke recent post di geeks, and.... lha setelah saya kasih comment, saya menemukan ini:

image

 

you see, the top post, yeah that, ada beberapa kemungkinan penyebabnya, menurut saya; pertama, memang si penulis langsung kasih komentar ke blognya sendiri, dan tidak di anggap sebagai viewer (?), tapi sepertinya hipotesis pertama salah soalnya saya yang memberikan komentar; kedua, memang ada flaw di sistem (CS) ini, atau yang ketiga ada mekanisme dimana user/other bisa kasih komentar (spam) tanpa melihat blognya (hipotesis ini juga tidak valid mengingat saya membaca blognya lebih dulu), dan kemungkinan keempat adalah pemahaman saya tentang "views" dan "comments" salah. sajujurnya saya belum pernah eksplor community server, jadi saya tidak tahu; dan sejujurnya saya lebih ingin menayakan ini ke admin daripada harus nulis ini, tapi saya tidak tahu harus kontak siapa (saya coba buka help (;() tapi malah lari ke doc.communityserver).

jadi mohon maaf atas postingan ini, hanya ingin memberi tahukan dan menanyakan kenapa ini bisa terjadi? so anyone, please, if you don't mind, explain to me.

{astaghfirullaah kenapa saya sering posting "negatif" begini}

Share this post: | | | |
Exploring F# (part. 1)

Bagi Anda yang suka functional programming, tentu sudah merasakan lezatnya pemrograman fungsional, dan jika anda pernah mendengar F# tentu pasti anda sudah pernah mengeksplorasinya. nah, bagi anda yang belum pernah mengeksplornya, silahkan baca postingan ini :).

1. output, main - main dengan fsi.exe CLI

eits, CLI yang ini bukan CLI yang itu, eh anu, maksud saya cli yang ini itu command line interpreter. ok, jadi ceritanya sudah install F# 1.9.3.14, nah sekarang kita main - main dengan command prompt. langsung panggil fsi.exe dan kita mulai eksplorasi kita:

image

isinya yang standar - standard saja, pertama kita say "hello world" model saya (adopsi K&R :) ), terus kita buat deklarasi variable x secara salah, tanpa nilai. terus buat lagi yang benar, kita isi string, setalah itu kita tampilkan nilai x. sekarang coba kita buat fungsi kali, test eksekusi kali, assign fungsi kali ke yang lain, test yang lain itu. dah, keluar (silahkan lanjutkan eksplorasi dengan cmd prompt sepuasnya)

2. fungsi, sekarang kita pake IDE nih,

sekarang kita akan menggunakan IDE untuk perangkat bantu, silahkan pake IDE anda, tentunya anda pasti punya VS kan? :), ok, saya pake sharpDevelop 3.0 beta, keduanya bisa di pake untuk kompilasi F#. pada bagian ini saya akan mencontohkan membuat sebuah fungsi dengan F#,  membuat fungsi di F# sangat mudah (namanya juga functional language) inilah dia salah satu selling point dari functional language, juga di F# (uhui! syntactic sugar..syntactic sugar). dalam contoh kali ini saya sekali lagi membuat fungsi factorial.

image

ok, sepuluh baris pertama itu cuman main - main saja, nah deklarasi fungsi dimulai pada baris ke-11, saya menggunakan keyword rec untuk definisikan fungsi rekursif. FYI, di F#, model deklarasi (semantiknya sih) kondisionalnya berbeda dengan bahasa non fungsional lain. skema : IF <kondisi> THEN <aksi> ELSE <aksilain> itu berlaku di pemrograman non fungsional, kalau di pemrograman fungsioal kaya F# ini nih jadinya IF <kondisi> THEN <return something> else <return something else> oleh karena itulah skema if-then-else di F# harus punya else; oleh karena permasalahan itulah membuat fungsi rekursif lebih di sukai disini.

terus di sana adalagi keyword match ... with; nah ini merupakan keyword untuk pattern matching, mirip - miriplah dengan switch...case. tiap kondisi matchingnya di pisahkan dengan vertical bar, return untuk tiap kondisi yang matching diungkapkan dengan tanda '->' . o iya, di sana ada fungsi - fungsi built-in yang gak punya return value (prosedur), sebenarnya gak harus di tangkap oleh variabl tertentu jadi saya menggunakan underscore '_' yang menandakan bahwa nilai variabel ini (_) gak penting. akhirnya, mari kita lihat hasil pelariannya (runningnya :P):

image

nah, itu dia hasilnya. yup, sementara ini dulu, nanti di sambung lagi (harus di pisah biar cepat lunas utangnya), bagian ke-2 nanti saya insyaaAllah akan mencoba menjelaskan tipe data/struktur data. jadi selamat ber-eksperimen ria.

Share this post: | | | |
Posted: Mar 26 2008, 01:56 PM by hakimrie | with no comments
Filed under:
Google Summer of Code 2008

image

Saya (how dare I'm :P!) turut mengumumkan bahwa Google Summer of Code 2008 telah dimulai, pendaftaran paling telat 31 Maret, jadi bagi anda yang masih memiliki status pelajar (s1/s2/s3) yang ingin berpartisipasi silahkan mendaftar di sini, uang $4500 + t-shirt & sertifikat dari google siap menjadi milik anda.

image

bagi yang suka C#, tahun ini Mono menjadi salah satu mentoring org, jadi silahkan segera mendaftarkan diri anda, bagi yang suka java apalagi c/c++ atau php, python, ruby (uhui :) ), etc.  yang suka cms-an (joomla, drupal, moodle), yang suka networking, yang suka distributed system, grid/cluster computing, photography, Os, compiler, security, database, sampai svn, semuanya ada, ayo tunggu apalagi, daftarkan diri anda segera, keburu kehabisan terlambat :D

Share this post: | | | |
Posted: Mar 26 2008, 06:12 AM by hakimrie | with 5 comment(s)
Filed under: ,
Simple Thread di C#

hua.., sudah lama gak posting sejak posting pertama. jadi punya utang banyak nih, ditambah denda jadinya ~30 postingan. ya sudah di bayar sambil jalan saja.

karena sekarang saya menggunakan ms vista dari usdi dengan hanya mengeluarkan dana IDR 50000 dan terinspirasi dari tulisan ronald dan tulisan saya beberapa waktu yang lalu di wordpress, saya coba menulis sebuah contoh sangat sederhana membuat thread di c#. kelas thread di c# ada di namespace System.Threading, jadi untuk membuat thread kita perlu ambil kelas dari sana.( setau saya) di .net terdapat 3 model thread STA, MTA, dan unknown. disini saya tidak akan membahas tentang masing - masing model tersebut, tapi akan lebih membahas contoh thread sederhana dalam c#.

ok, sekarang kita definisikan sebuah operasi yang akan dijadikan thread, dalam hal ini kita buat operasi penghitungan nilai faktorial dari beberapa bilangan bulat. untuk alasan suka - suka saya  keeleganan, saya memisahkan kode program dalam dua kelas, kelas pertama untuk definisi operasi, dan kelas kedua untuk mengeksekusi operasi (sebagai driver). tidak perlu panjang lebar mari kita lihat kode programnya:

public class SimpleThread
{
    private int idx;
    private int[] arrInt = { 10, 4, 15, 6, 7, 18, 9 };
    public SimpleThread(int i) {
        idx = i;
    }
    // non-recursive factorial
    public long Factorial(int val)
    {
        long fact = 1;
        try
        {
            // biar kode gak panjang, asumsi input pasti >= 1
            for (int i = 1; i <= val; i++)
            {
                fact *= i;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
        }

        return fact;
    }

    public void itungFactorial()
    {
        long fact = Factorial(arrInt[idx]);
        Console.WriteLine("{0}. {1}! = {2}",idx+1,arrInt[idx],fact);
        Thread.Sleep(300);
    }

}

nah, di kelas simpleThread, saya mendefinisikan method Factorial(int val) untuk menghitung nilai faktorial dari bilangan bulat val, dan sebuah method wrapper itungFactorial() untuk wrapper method Factorial(int val); method inilah yang nanti akan di passing dalam sebuah thread di kelas MainThread. kelas MainThread cuma berisi main class, untuk mengeksekusi penghitungan factorial dalam sebuah thread. nah sekarang kita definisikan kelas MainThread:

public class MainThread
{
    public static void Main(string[] args)
    {
        long start0, end0, start1, end1;

        Console.WriteLine("<<<<<<<<<Serial>>>>>>>>>");
        start0 =  DateTime.Now.Ticks;   // start serial exc
        for (int i = 0; i < 7; i++) {
            SimpleThread st0 = new SimpleThread(i);
            st0.itungFactorial();
        }
        end0 = DateTime.Now.Ticks;      // end serial exc
        Console.WriteLine("<<<<<<<<<Paralel>>>>>>>>>");
        start1 = DateTime.Now.Ticks;    // start paralel exc
        for (int i = 0; i < 7; i++)
        {
            SimpleThread st = new SimpleThread(i);
            Thread t = new Thread(new ThreadStart(st.itungFactorial));
            t.Start();
        }
        end1 = DateTime.Now.Ticks;      // end paralel exc

        Console.WriteLine("<<<<<<<<<Info>>>>>>>>>");
        Console.WriteLine("waktu serial = {0}\nwaktu paralel = {1}", end0 - start0, end1 - start1);
        Console.WriteLine("paralel {0}x lebih cepat dari serial", ((double)(end0 - start0) / (end1 - start1)));
    }
}

dan sekarang kita compile dan eksekusi:

image

nah, terlihat bahwa eksekusi secara paralel ternyata terbukti lebih cepat untuk satu kasus ini. hasil eksekusi memang tidak selalu sama dengan ini, tapi kurang lebih seperti itulah hasilnya.

sebagai catatan, untuk memeriksa waktu eksekusi jangan menggunakan properti DateTime.Now.Milisecond, bahaya !, soalnya yang di ambil adalah milidetik relatif terhadap detik sekarang; oleh karena itu saya menggunakan DateTime.Now.Ticks; soalnya sekalian mau ngitung durasi eksekusi. untuk sementara sebagai pemanasan ini dulu saja postingan saya :).

Share this post: | | | |
Posted: Mar 25 2008, 05:14 PM by hakimrie | with no comments
Filed under: