Banyak dari jawaban ini memberikan alasan yang valid mengapa C adalah, atau tidak, lebih cepat (baik dalam skenario umum atau khusus). Tidak dapat dipungkiri bahwa:
- Banyak bahasa lain menyediakan fitur otomatis yang kami anggap remeh. Pengecekan batas, pemeriksaan jenis run-time, dan manajemen memori otomatis, misalnya, tidak datang secara gratis. Setidaknya ada beberapa biaya yang terkait dengan fitur-fitur ini, yang mungkin tidak kita pikirkan — atau bahkan sadari — ketika menulis kode yang menggunakan fitur-fitur ini.
- Langkah dari sumber ke mesin sering tidak langsung dalam bahasa lain seperti dalam C.
- OTOH, untuk mengatakan bahwa kode C yang dikompilasi dieksekusi lebih cepat daripada kode lain yang ditulis dalam bahasa lain adalah generalisasi yang tidak selalu benar. Contoh tandingan mudah ditemukan (atau dibuat-buat).
Meskipun demikian, ada hal lain yang saya perhatikan bahwa, saya pikir, mempengaruhi kinerja komparatif C vs banyak bahasa lain lebih besar daripada faktor lainnya. Yakni:
Bahasa lain sering membuatnya lebih mudah untuk menulis kode yang dieksekusi lebih lambat. Seringkali, itu bahkan didorong oleh filosofi desain bahasa. Konsekuensi: seorang programmer C lebih cenderung menulis kode yang tidak melakukan operasi yang tidak perlu.
Sebagai contoh, pertimbangkan program Windows sederhana di mana satu jendela utama dibuat. Versi AC akan mengisi WNDCLASS[EX]
struktur yang akan diteruskan RegisterClass[Ex]
, lalu memanggil CreateWindow[Ex]
dan memasukkan loop pesan. Kode yang sangat disederhanakan dan disingkat mengikuti:
WNDCLASS wc;
MSG msg;
wc.style = 0;
wc.lpfnWndProc = &WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWndCls";
RegisterClass(&wc);
CreateWindow("MainWndCls", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Program yang setara dalam C # bisa jadi hanya satu baris kode:
Application.Run(new Form());
Satu baris kode ini menyediakan semua fungsi yang dilakukan hampir 20 baris kode C, dan menambahkan beberapa hal yang kami tinggalkan, seperti pengecekan kesalahan. Pustaka yang lebih kaya dan lebih lengkap (dibandingkan dengan yang digunakan dalam proyek C khas) melakukan banyak pekerjaan bagi kami, membebaskan waktu kami untuk menulis lebih banyak potongan kode yang terlihat pendek bagi kami tetapi melibatkan banyak langkah di belakang layar.
Tapi perpustakaan yang kaya memungkinkan kode mudah dan cepat mengasapi bukan maksud saya. Maksud saya lebih jelas ketika Anda mulai memeriksa apa yang sebenarnya terjadi ketika one-liner kecil kami benar-benar dieksekusi. Untuk bersenang-senang kadang-kadang, aktifkan akses sumber .NET di Visual Studio 2008 atau lebih tinggi, dan masuk ke baris-sederhana di atas. Salah satu permata kecil yang menyenangkan yang akan Anda temui adalah komentar ini di pengambil untuk Control.CreateParams
:
// In a typical control this is accessed ten times to create and show a control.
// It is a net memory savings, then, to maintain a copy on control.
//
if (createParams == null) {
createParams = new CreateParams();
}
Sepuluh kali . Informasi yang kira-kira setara dengan jumlah dari apa yang disimpan dalam suatu WNDCLASSEX
struktur dan apa yang diteruskan CreateWindowEx
diambil dari Control
kelas sepuluh kali sebelum disimpan dalam suatu WNDCLASSEX
struktur dan diteruskan ke RegisterClassEx
dan CreateWindowEx
.
Secara keseluruhan, jumlah instruksi yang dieksekusi untuk melakukan tugas yang sangat mendasar ini adalah 2-3 kali lipat lebih banyak di C # daripada di C. Bagian dari ini adalah karena penggunaan perpustakaan kaya fitur, yang perlu digeneralisasi, dibandingkan kode C sederhana yang melakukan persis apa yang kita butuhkan dan tidak lebih. Tetapi bagian dari itu adalah karena fakta bahwa sifat kerangka kerja .NET yang termodulasiasikan dan berorientasi objek, cocok untuk banyak pengulangan eksekusi yang sering dihindari oleh pendekatan prosedural.
Saya tidak mencoba untuk memilih C # atau framework .NET. Saya juga tidak mengatakan bahwa modularisasi, generalisasi, fitur perpustakaan / bahasa, OOP, dll. Adalah hal-hal buruk . Saya biasa melakukan sebagian besar pengembangan saya di C, kemudian di C ++, dan paling akhir di C #. Demikian pula, sebelum C, saya menggunakan kebanyakan perakitan. Dan dengan setiap langkah "lebih tinggi" bahasa saya berjalan, saya menulis program yang lebih baik, lebih dapat dikelola, lebih kuat dalam waktu yang lebih singkat. Namun, mereka cenderung melakukan sedikit lebih lambat.