Secara teori, metode statis harus bekerja sedikit lebih baik daripada metode instance, semua hal lain dianggap sama, karena this
parameter tersembunyi ekstra .
Dalam praktiknya, ini hanya membuat sedikit perbedaan sehingga akan tersembunyi dalam kebisingan berbagai keputusan compiler. (Oleh karena itu, dua orang dapat "membuktikan" yang satu lebih baik daripada yang lain dengan hasil yang tidak setuju). Paling tidak karena this
biasanya diteruskan dalam register dan sering kali dalam register itu untuk memulai.
Poin terakhir ini berarti bahwa dalam teori, kita harus mengharapkan metode statis yang mengambil objek sebagai parameter dan melakukan sesuatu dengannya menjadi sedikit kurang baik daripada yang setara sebagai instance pada objek yang sama. Sekali lagi, perbedaannya sangat kecil sehingga jika Anda mencoba mengukurnya, Anda mungkin akan mengukur beberapa keputusan compiler lainnya. (Terutama karena kemungkinan jika referensi itu berada dalam register sepanjang waktu juga cukup tinggi).
Perbedaan kinerja sebenarnya akan turun ke apakah Anda memiliki objek secara artifisial dalam memori untuk melakukan sesuatu yang seharusnya statis, atau Anda menjerat rantai pengoperan objek dengan cara yang rumit untuk melakukan apa yang seharusnya secara alami menjadi contoh.
Oleh karena itu untuk nomor 1. Ketika menjaga status bukanlah masalah, selalu lebih baik untuk menjadi statis, karena untuk itulah statis . Ini bukan masalah kinerja, meskipun ada aturan keseluruhan untuk bermain baik dengan pengoptimalan kompiler - kemungkinan besar seseorang berusaha mengoptimalkan kasus yang muncul dengan penggunaan normal daripada kasus yang muncul dengan penggunaan aneh.
Nomor 2. Tidak ada bedanya. Ada sejumlah biaya per kelas untuk setiap anggota, baik dari segi berapa banyak metadata yang ada, berapa banyak kode yang ada dalam file DLL atau EXE yang sebenarnya, dan berapa banyak kode jitted yang ada. Ini sama apakah itu instance atau statis.
Dengan item 3, this
seperti this
halnya. Namun perhatikan:
The this
parameter dilewatkan di register tertentu. Saat memanggil metode instance dalam kelas yang sama, kemungkinan besar sudah ada di register itu (kecuali jika disimpan dan register digunakan untuk beberapa alasan) dan karenanya tidak ada tindakan yang diperlukan untuk menyetel this
ke apa yang perlu disetel ke . Ini berlaku sampai batas tertentu misalnya, dua parameter pertama pada metode menjadi dua parameter pertama dari panggilan yang dibuatnya.
Karena akan jelas bahwa this
ini bukan null, ini dapat digunakan untuk mengoptimalkan panggilan dalam beberapa kasus.
Karena akan jelas bahwa this
itu bukan null, ini dapat membuat pemanggilan metode sebaris lebih efisien lagi, karena kode yang dihasilkan untuk memalsukan pemanggilan metode dapat menghilangkan beberapa pemeriksaan nol yang mungkin diperlukan.
Konon, cek nol itu murah!
Perlu dicatat bahwa metode statis generik yang bekerja pada suatu objek, daripada metode instan, dapat mengurangi beberapa biaya yang dibahas di http://joeduffyblog.com/2011/10/23/on-generics-and-some-of- overhead-terkait / dalam kasus di mana statis yang diberikan tidak dipanggil untuk jenis tertentu. Seperti yang dia katakan, "Sebagai tambahan, ternyata metode penyuluhan adalah cara yang bagus untuk membuat abstraksi umum lebih menguntungkan."
Namun, perhatikan bahwa ini hanya berkaitan dengan instansiasi tipe lain yang digunakan oleh metode, yang sebaliknya tidak ada. Dengan demikian, ini benar-benar tidak berlaku untuk banyak kasus (beberapa metode contoh lain menggunakan tipe itu, beberapa kode lain di tempat lain menggunakan tipe itu).
Ringkasan:
- Sebagian besar biaya kinerja instans vs statis di bawah dapat diabaikan.
- Biaya yang ada biasanya akan datang jika Anda menyalahgunakan statis misalnya atau sebaliknya. Jika Anda tidak menjadikannya bagian dari keputusan Anda antara statis dan instance, kemungkinan besar Anda akan mendapatkan hasil yang benar.
- Ada kasus yang jarang terjadi di mana metode generik statis di tipe lain menghasilkan lebih sedikit tipe yang dibuat, daripada metode generik contoh, yang membuatnya terkadang memiliki manfaat kecil untuk mengubah yang jarang digunakan (dan "jarang" mengacu pada tipe yang digunakan dengannya di masa pakai aplikasi, bukan seberapa sering dipanggil). Setelah Anda mendapatkan apa yang dia bicarakan di artikel itu, Anda akan melihat bahwa itu 100% tidak relevan dengan sebagian besar keputusan statis-vs-contoh. Sunting: Dan sebagian besar hanya memiliki biaya dengan ngen, bukan dengan kode jitted.
Sunting: Sebuah catatan tentang betapa murahnya cek-nol (yang saya klaim di atas). Kebanyakan pemeriksaan-nol di .NET tidak memeriksa nol sama sekali, melainkan mereka melanjutkan apa yang akan mereka lakukan dengan asumsi bahwa itu akan berhasil, dan jika pengecualian akses terjadi, itu akan berubah menjadi NullReferenceException
. Dengan demikian, sebagian besar ketika secara konseptual kode C # melibatkan pemeriksaan null karena mengakses anggota instance, biaya jika berhasil sebenarnya nol. Pengecualiannya adalah beberapa panggilan inline, (karena mereka ingin berperilaku seolah-olah mereka memanggil anggota instance) dan mereka baru saja menekan sebuah bidang untuk memicu perilaku yang sama, jadi panggilan tersebut juga sangat murah, dan mereka masih sering ditinggalkan (misalnya jika langkah pertama dalam metode tersebut melibatkan mengakses bidang sebagaimana adanya).