jump to navigation

Performa Exception Dibandingkan Return Value 23 Juni 2008

Posted by firstyuyu in .net framework.
trackback

Pada artikel Exception Design (Bagian 01) kita sudah membahas mengenai keuntungan-keuntungan penggunaan exception. Namun exception juga mempunyai satu kekurangan, yaitu masalah performa. Pada artikel ini, kita akan mencoba melihat sejauh mana perbedaan performa exception dibandingkan dengan return value. Diharapkan, dari pembahasan ini bisa menambah wawasan kita ketika mendesain sebuah exception.

Untuk mempersingkat, kita akan langsung mulai dengan contoh. Kita akan membandingkan dua buah method, yang satu menggunakan return value dengan mengembalikan nilai integer acak, sementara yang satu lagi akan melontarkan exception. Kedua method tersebut sbb:

static Random rnd = new Random();

 

static void FailedMethod1()

{

    throw new Exception(“Some message”);

}

 

static int FailedMethod2()

{

    return rnd.Next();

}

Kita akan mengeksekusi masing-masing method di atas dalam sebuah looping. Kemudian, menggunakan dengan menggunakan kelas Stopwatch, kita bandingkan waktu yang dibutuhkan oleh keduanya. Berikut ini kode untuk mengukur waktu yang dibutuhkan oleh method yang melontarkan exception:

StopWatch sw = new StopWatch();

sw.Start();

 

for (int i = 0; i < 10000; i++)

{

    try

    {

        FailedMethod1();

    }

    catch (Exception) { }

}

 

sw.Stop();

Console.WriteLine(“Exception: {0} seconds”, sw.DurationInSeconds);

 

Dan kode berikut digunakan untuk mengukur waktu yang dibutuhkan oleh method yang mengembalikan return value:

 

StopWatch sw = new StopWatch();

sw.Start();

 

for (int i = 0; i < 10000; i++)

{

    int errCode = FailedMethod2();

}

 

sw.Stop();

Console.WriteLine(“Return Value: {0} seconds”, sw.DurationInSeconds);

Ketika kode di atas saya jalankan langsung di command prompt (bukan dengan menekan F5 di Visual Studio), hasilnya sbb sbb:

 

Return Value: 0,000174882561889849 seconds

Exception: 0,288586957280883 seconds

 

 

Bisa kita lihat dari output di atas bahwa menggunakan exception bisa berkali-kali lipat lebih lambat daripada menggunakan return value. Hal ini harus kita pertimbangkan ketika kita mendesain exception maupun ketika menulis kode yang berhubungan dengan exception.

Jika sebuah method yang potensial melontarkan exception kita eksekusi di dalam sebuah looping yang banyak dan sebagian besar pemanggilannya gagal (sehingga berakibat terlontarnya exception), maka hal ini bisa menjadi bencana bagi performa aplikasi kita. Bisa terjadi penurunan performa yang singnifikan.

Di sini bukan berarti saya tidak menyarankan penggunaan exception. Exception merupakan mekanisme yang sangat ampuh dalam pelaporan kesalahan. Dan kelebihan-kelebihan yang dimilikinya mengalahkan kekurangannya dalam hal performa.

Jadi tugas kita sebagai desainer framework adalah bagaimana menerapkan pattern di framework yang kita buat sehingga developer bisa meminimalisir dampak negatif exception terhadap performa. Pattern yang biasa digunakan dalam hal ini adalah Tester Doer dan Try Parse yang akan dibahas pada artikel berikutnya.

Berikut ini source code lengkap program di atas:

using System;

 

public class ExceptionPeformanceTest

{

    static Random rnd = new Random();

 

    public static void Main()

    {

        int iteration = 1000;

        Console.WriteLine(“Starting test with {0} iterations…”, iteration);

 

        ReturnValuePerformanceTest(iteration);

        ExceptionPerformanceTest(iteration);

 

        Console.ReadLine();

    }

 

    private static void ReturnValuePerformanceTest(int iteration)

    {

        StopWatch sw = new StopWatch();

        sw.Start();

 

        for (int i = 0; i < iteration; i++)

        {

            int errCode = FailedMethod2();

        }

 

        sw.Stop();

        Console.WriteLine(“Return Value: {0} seconds”, sw.DurationInSeconds);

    }

 

    private static void ExceptionPerformanceTest(int iteration)

    {

        StopWatch sw = new StopWatch();

        sw.Start();

 

        for (int i = 0; i < iteration; i++)

        {

            try

            {

                FailedMethod1();

            }

            catch (Exception) { }

        }

 

        sw.Stop();

        Console.WriteLine(“Exception: {0} seconds”, sw.DurationInSeconds);

    }

 

    static void FailedMethod1()

    {

        throw new Exception(“Some message”);

    }

 

    static int FailedMethod2()

    {

        return rnd.Next();

    }

}
 
 
 

 

 

Iklan

Komentar»

No comments yet — be the first.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: