Dari waktu ke waktu saya membaca bahwa Fortran adalah atau bisa lebih cepat daripada C untuk perhitungan yang berat. Apakah itu benar? Saya harus mengakui bahwa saya hampir tidak mengenal Fortran, tetapi kode Fortran yang saya lihat sejauh ini tidak menunjukkan bahwa bahasa tersebut memiliki fitur yang tidak dimiliki C.
Jika itu benar, tolong beri tahu saya alasannya. Tolong jangan katakan padaku apa bahasa atau lib yang baik untuk angka-angka, saya tidak bermaksud untuk menulis aplikasi atau lib untuk melakukan itu, saya hanya ingin tahu.
c
performance
fortran
quinmars
sumber
sumber
Jawaban:
Bahasa memiliki set fitur yang serupa. Perbedaan kinerja berasal dari fakta bahwa Fortran mengatakan aliasing tidak diperbolehkan, kecuali jika pernyataan EQUIVALENCE digunakan. Setiap kode yang memiliki alias tidak sah Fortran, tetapi terserah kepada programmer dan bukan kompiler untuk mendeteksi kesalahan ini. Dengan demikian kompiler Fortran mengabaikan kemungkinan aliasing dari memory pointer dan memungkinkan mereka untuk menghasilkan kode yang lebih efisien. Lihatlah contoh kecil ini di C:
Fungsi ini akan berjalan lebih lambat daripada rekan Fortran setelah optimasi. Kenapa begitu? Jika Anda menulis nilai ke dalam array output, Anda dapat mengubah nilai-nilai matriks. Bagaimanapun, pointer bisa tumpang tindih dan menunjuk ke memori yang sama (termasuk
int
pointer!). Kompiler C dipaksa untuk memuat ulang empat nilai matriks dari memori untuk semua perhitungan.Di Fortran kompiler dapat memuat nilai matriks satu kali dan menyimpannya di register. Hal ini dapat dilakukan karena kompiler Fortran mengasumsikan pointer / array tidak tumpang tindih dalam memori.
Untungnya,
restrict
kata kunci dan aliasing ketat telah diperkenalkan ke standar C99 untuk mengatasi masalah ini. Ini didukung dengan baik di sebagian besar kompiler C ++ hari ini juga. Kata kunci memungkinkan Anda untuk memberikan kompiler petunjuk bahwa programmer menjanjikan bahwa pointer tidak alias dengan pointer lain. Aliasing yang ketat berarti bahwa pemrogram berjanji bahwa pointer dari tipe yang berbeda tidak akan pernah tumpang tindih, misalnya adouble*
tidak akan tumpang tindih denganint*
(dengan pengecualian khususchar*
danvoid*
dapat tumpang tindih dengan apa pun).Jika Anda menggunakannya, Anda akan mendapatkan kecepatan yang sama dari C dan Fortran. Namun, kemampuan untuk menggunakan
restrict
kata kunci hanya dengan fungsi kritis kinerja berarti bahwa program C (dan C ++) jauh lebih aman dan lebih mudah untuk ditulis. Sebagai contoh, pertimbangkan kode Fortran yang tidak valid:,CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
yang kebanyakan kompiler Fortran akan dengan senang hati mengkompilasi tanpa peringatan apa pun tetapi memperkenalkan bug yang hanya muncul pada beberapa kompiler, pada beberapa perangkat keras dan dengan beberapa opsi optimasi.sumber
call transform
misalnya tidak memiliki banyak akal.Ya, pada 1980; pada tahun 2008? tergantung
Ketika saya mulai pemrograman secara profesional, dominasi kecepatan Fortran ditantang. Saya ingat pernah membaca tentang itu di Dr. Dobbs dan memberi tahu programmer yang lebih tua tentang artikel itu - mereka tertawa.
Jadi saya punya dua pandangan tentang ini, teoretis dan praktis. Secara teori, Fortran saat ini tidak memiliki keunggulan intrinsik untuk C / C ++ atau bahkan bahasa apa pun yang memungkinkan kode perakitan. Dalam praktiknya, Fortran saat ini masih menikmati manfaat peninggalan sejarah dan budaya yang dibangun di seputar optimalisasi kode numerik.
Sampai dan termasuk Fortran 77, pertimbangan desain bahasa memiliki optimasi sebagai fokus utama. Karena keadaan teori dan teknologi kompiler, ini sering berarti membatasi fitur dan kemampuan untuk memberikan kompiler kesempatan terbaik dalam mengoptimalkan kode. Analogi yang baik adalah menganggap Fortran 77 sebagai mobil balap profesional yang mengorbankan fitur untuk kecepatan. Saat ini kompiler telah menjadi lebih baik di semua bahasa dan fitur untuk produktivitas programmer lebih dihargai. Namun, masih ada tempat-tempat di mana orang-orang terutama memperhatikan kecepatan dalam komputasi ilmiah; orang-orang ini kemungkinan besar telah mewarisi kode, pelatihan dan budaya dari orang-orang yang sendiri adalah programmer Fortran.
Ketika seseorang mulai berbicara tentang optimasi kode ada banyak masalah dan cara terbaik untuk merasakan ini adalah untuk bersembunyi di mana orang-orang yang tugasnya adalah memiliki kode numerik yang cepat . Tetapi perlu diingat bahwa kode sensitif seperti itu biasanya merupakan sebagian kecil dari keseluruhan baris kode dan sangat terspesialisasi: Banyak kode Fortran sama "tidak efisiennya" dengan banyak kode lain dalam bahasa lain dan pengoptimalan bahkan tidak boleh perhatian utama dari kode tersebut .
Tempat yang bagus untuk memulai mempelajari tentang sejarah dan budaya Fortran adalah wikipedia. Entri Fortran Wikipedia luar biasa dan saya sangat menghargai mereka yang telah meluangkan waktu dan upaya untuk menjadikannya bernilai bagi komunitas Fortran.
(Versi singkat dari jawaban ini adalah komentar di utas luar biasa yang dimulai oleh Nils tetapi saya tidak memiliki karma untuk melakukan itu. Sebenarnya, saya mungkin tidak akan menulis apa pun kecuali untuk itu utas ini memiliki aktual konten informasi dan berbagi yang bertentangan dengan nyala api dan kefanatikan bahasa, yang merupakan pengalaman utama saya dengan subjek ini. Saya kewalahan dan harus berbagi cinta.)
sumber
Sampai batas tertentu, Fortran telah dirancang dengan tetap mengingat optimisasi kompiler. Bahasa ini mendukung operasi seluruh array di mana kompiler dapat mengeksploitasi paralelisme (khususnya pada prosesor multi-core). Sebagai contoh,
Perkalian matriks padat adalah sederhana:
Norma L2 dari vektor x adalah:
Selain itu pernyataan seperti
FORALL
,PURE
&ELEMENTAL
prosedur dll. Lebih lanjut membantu mengoptimalkan kode. Bahkan petunjuk di Fortran tidak sefleksibel C karena alasan sederhana ini.Standar Fortran mendatang (2008) memiliki co-array yang memungkinkan Anda untuk dengan mudah menulis kode paralel. G95 (open source) dan kompiler dari CRAY sudah mendukungnya.
Jadi ya Fortran bisa cepat hanya karena kompiler dapat mengoptimalkan / memparalelasinya lebih baik daripada C / C ++. Tetapi sekali lagi seperti segala hal lain dalam hidup ada kompiler yang baik dan kompiler yang buruk.
sumber
forall
konstruk sudah ditinggalkan karena compiler tidak bisa mengoptimalkan kode baik. Penggantinya adalahdo concurrent
. Juga, kodesqrt(sum(x**2))
terlihat tidak efisien, karena kompiler mungkin membangun seluruh vektorx**2
. Saya akan menebak bahwa loop lebih baik, tetapi tidak diragukan lagi yang terbaik untuk memanggilnorm2
fungsi intrinsik .Sangat lucu bahwa banyak jawaban di sini dari tidak tahu bahasa. Hal ini terutama berlaku untuk programmer C / C ++ yang telah membuka dan lama kode FORTRAN 77 dan mendiskusikan kelemahannya.
Saya kira masalah kecepatan sebagian besar adalah pertanyaan antara C / C ++ dan Fortran. Dalam kode Huge, selalu tergantung pada programmer. Ada beberapa fitur bahasa yang mengungguli Fortran dan beberapa fitur yang tidak C lakukan. Jadi, pada 2011, tidak ada yang bisa mengatakan mana yang lebih cepat.
Tentang bahasa itu sendiri, Fortran saat ini mendukung fitur OOP Penuh dan sepenuhnya kompatibel ke belakang. Saya telah menggunakan Fortran 2003 secara menyeluruh dan saya akan mengatakan itu menyenangkan untuk menggunakannya. Dalam beberapa aspek, Fortran 2003 masih di belakang C ++ tetapi mari kita lihat penggunaannya. Fortran sebagian besar digunakan untuk Komputasi Numerik, dan tidak ada yang menggunakan fitur C ++ OOP yang mewah karena alasan kecepatan. Dalam komputasi kinerja tinggi, C ++ hampir tidak memiliki tempat untuk dikunjungi (lihatlah standar MPI dan Anda akan melihat bahwa C ++ telah ditinggalkan!).
Saat ini, Anda cukup melakukan pemrograman bahasa campuran dengan Fortran dan C / C ++. Bahkan ada antarmuka untuk GTK + di Fortran. Ada kompiler gratis (Gfortran, G95) dan banyak komersial yang sangat baik.
sumber
Ada beberapa alasan mengapa Fortran bisa lebih cepat. Namun jumlah yang mereka perhitungkan sangat tidak penting atau dapat dikerjakan di mana pun, sehingga tidak masalah. Alasan utama untuk menggunakan Fortran saat ini adalah mempertahankan atau memperluas aplikasi warisan.
PURE dan ELEMENTAL kata kunci pada fungsi. Ini adalah fungsi yang tidak memiliki efek samping. Ini memungkinkan optimisasi dalam kasus-kasus tertentu di mana kompiler mengetahui fungsi yang sama akan dipanggil dengan nilai yang sama. Catatan: GCC mengimplementasikan "pure" sebagai ekstensi ke bahasa. Kompiler lain mungkin juga. Analisis antar-modul juga dapat melakukan optimasi ini tetapi sulit.
serangkaian fungsi standar yang berhubungan dengan array, bukan elemen individual. Hal-hal seperti sin (), log (), sqrt () mengambil array alih-alih skalar. Ini membuatnya lebih mudah untuk mengoptimalkan rutinitas. Vektorisasi otomatis memberikan manfaat yang sama dalam banyak kasus jika fungsi-fungsi ini inline atau builtin
Tipe builtin kompleks. Secara teori ini dapat memungkinkan kompiler untuk menyusun ulang atau menghilangkan instruksi tertentu dalam kasus-kasus tertentu, tetapi kemungkinan Anda akan melihat manfaat yang sama dengan struct {double re, im; }; idiom yang digunakan dalam C. Itu membuat untuk pengembangan lebih cepat karena sebagai operator bekerja pada jenis kompleks di fortran.
sumber
{ double re, im; };
idiom struct yang digunakan dalam C". Kompiler C kemungkinan besar akan mengembalikan struct itu dalam bentuk sret dengan ruang pemanggil stack mengalokasikan, melewati pointer ke callee yang mengisinya. Itu beberapa kali lebih lambat daripada mengembalikan beberapa nilai dalam register seperti yang dilakukan kompiler Fortran. Perhatikan bahwa C99 memperbaiki ini dalam kasus khusus kompleks.Saya pikir poin kunci yang mendukung Fortran adalah bahwa itu adalah bahasa yang sedikit lebih cocok untuk mengekspresikan matematika berbasis vektor dan array. Masalah analisis penunjuk yang ditunjukkan di atas adalah nyata dalam praktiknya, karena kode portabel tidak dapat benar-benar berasumsi bahwa Anda dapat memberitahu sesuatu kepada kompiler. Ada SELALU keuntungan untuk komputasi ekspresi dengan cara yang lebih dekat dengan bagaimana domain terlihat. C tidak benar-benar memiliki array sama sekali, jika Anda melihat lebih dekat, hanya sesuatu yang berperilaku seperti itu. Fortran memiliki arrawi nyata. Yang membuatnya lebih mudah untuk dikompilasi untuk jenis algoritma tertentu terutama untuk mesin paralel.
Jauh di lubuk hati seperti sistem run-time dan konvensi pemanggilan, C dan Fortran modern cukup mirip sehingga sulit untuk melihat apa yang akan membuat perbedaan. Perhatikan bahwa C di sini benar-benar basis C: C ++ adalah masalah yang sangat berbeda dengan karakteristik kinerja yang sangat berbeda.
sumber
Tidak ada yang lebih cepat dari satu bahasa, jadi jawaban yang tepat adalah tidak .
Yang benar-benar harus Anda tanyakan adalah "apakah kode yang dikompilasi dengan Fortran compiler X lebih cepat dari kode yang sama yang dikompilasi dengan C compiler Y?" Jawaban atas pertanyaan itu tentu saja tergantung pada dua kompiler yang Anda pilih.
Pertanyaan lain yang bisa ditanyakan adalah di sepanjang baris "Mengingat upaya yang sama dilakukan untuk mengoptimalkan dalam kompiler mereka, kompiler mana yang akan menghasilkan kode lebih cepat?" Jawabannya sebenarnya adalah Fortran . Kompiler Fortran memiliki keunggulan certian:
Namun, tidak ada yang menghentikan seseorang untuk melakukan banyak upaya dalam optimasi kompiler C mereka, dan membuatnya menghasilkan kode yang lebih baik daripada kompiler Fortran platform mereka. Bahkan, penjualan yang lebih besar yang dihasilkan oleh kompiler C membuat skenario ini cukup layak
sumber
Ada item lain di mana Fortran berbeda dari C - dan berpotensi lebih cepat. Fortran memiliki aturan optimisasi yang lebih baik daripada C. Di Fortran, urutan evaluasi ekspresi tidak didefinisikan, yang memungkinkan kompiler untuk mengoptimalkannya - jika seseorang ingin memaksakan urutan tertentu, seseorang harus menggunakan tanda kurung. Dalam C urutannya jauh lebih ketat, tetapi dengan opsi "-cepat", mereka lebih santai dan "(...)" juga diabaikan. Saya pikir Fortran memiliki cara yang terletak dengan baik di tengah. (Yaitu, IEEE membuat siaran langsung menjadi lebih sulit karena perubahan urutan evaluasi tertentu mensyaratkan tidak terjadi luapan, yang harus diabaikan atau menghambat evaluasi).
Area lain dari aturan yang lebih cerdas adalah bilangan kompleks. Tidak hanya itu diperlukan sampai C 99 bahwa C memilikinya, juga aturan yang mengaturnya lebih baik di Fortran; karena perpustakaan Fortran dari gfortran sebagian ditulis dalam C tetapi mengimplementasikan semantik Fortran, GCC memperoleh opsi (yang juga dapat digunakan dengan program C "normal"):
Aturan alias yang disebutkan di atas adalah bonus lain dan juga - setidaknya pada prinsipnya - operasi seluruh-array, yang jika diperhitungkan dengan benar oleh pengoptimal kompiler, dapat menyebabkan kode lebih cepat. Di sisi berlawanan adalah bahwa operasi tertentu membutuhkan waktu lebih lama, misalnya jika seseorang melakukan penugasan untuk array yang dapat dialokasikan, ada banyak pemeriksaan yang diperlukan (realokasi? [Fitur Fortran 2003], memiliki langkah array, dll.), Yang membuat operasi sederhana lebih kompleks di belakang layar - dan karenanya lebih lambat, tetapi membuat bahasa lebih kuat. Di sisi lain, operasi array dengan batas dan langkah yang fleksibel membuatnya lebih mudah untuk menulis kode - dan kompiler biasanya lebih baik mengoptimalkan kode daripada pengguna.
Secara total, saya pikir C dan Fortran keduanya sama cepatnya; pilihannya harus lebih banyak bahasa mana yang disukai atau apakah menggunakan operasi seluruh-array Fortran dan portabilitasnya yang lebih baik lebih bermanfaat - atau antarmuka yang lebih baik ke perpustakaan sistem dan grafis-antarmuka pengguna di C.
sumber
Tidak ada tentang bahasa Fortran dan C yang membuat satu lebih cepat daripada yang lain untuk tujuan tertentu. Ada beberapa hal tentang kompiler khusus untuk masing-masing bahasa yang membuat beberapa tugas tertentu lebih disukai daripada yang lain.
Selama bertahun-tahun, ada kompiler Fortran yang bisa melakukan sihir hitam untuk rutinitas numerik Anda, membuat banyak perhitungan penting dengan sangat cepat. Kompiler C kontemporer tidak bisa melakukannya juga. Akibatnya, sejumlah perpustakaan kode berkembang di Fortran. Jika Anda ingin menggunakan pustaka yang telah teruji, dewasa, dan luar biasa ini, Anda bisa keluar dari kompiler Fortran.
Pengamatan informal saya menunjukkan bahwa saat ini orang-orang mengkodekan hal-hal komputasi berat mereka dalam bahasa lama apa pun, dan jika butuh beberapa saat mereka menemukan waktu pada beberapa cluster komputasi murah. Hukum Moore membodohi kita semua.
sumber
Saya membandingkan kecepatan Fortran, C, dan C ++ dengan tolok ukur Levine-Callahan-Dongarra klasik dari netlib. Versi banyak bahasa, dengan OpenMP, adalah http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C lebih jelek, karena dimulai dengan terjemahan otomatis, ditambah penyisipan batasan dan pragma untuk kepastian kompiler. C ++ hanyalah C dengan templat STL yang berlaku. Menurut pendapat saya, STL adalah tas campuran, apakah itu meningkatkan perawatan.
Hanya ada sedikit latihan fungsi otomatis di-lining untuk melihat sejauh mana ia meningkatkan optimasi, karena contoh-contoh didasarkan pada praktik Fortran tradisional di mana sedikit ketergantungan ditempatkan pada in-lining.
Kompiler C / C ++ yang sejauh ini penggunaannya paling luas tidak memiliki auto-vektorisasi, di mana tolok ukur ini sangat bergantung.
Tuliskan pos yang datang sebelum ini: ada beberapa contoh di mana tanda kurung digunakan di Fortran untuk menentukan urutan evaluasi yang lebih cepat atau lebih akurat. Kompiler C yang dikenal tidak memiliki opsi untuk mengamati tanda kurung tanpa menonaktifkan optimisasi yang lebih penting.
sumber
Saya seorang programmer hobbyist dan saya "rata-rata" di kedua bahasa. Saya merasa lebih mudah untuk menulis kode Fortran cepat daripada kode C (atau C ++). Baik Fortran dan C adalah bahasa "bersejarah" (menurut standar saat ini), banyak digunakan, dan telah mendukung kompiler gratis dan komersial.
Saya tidak tahu apakah ini fakta sejarah tetapi Fortran merasa itu dibangun untuk diparalelkan / didistribusikan / di-vektorisasi / apa pun-banyak-core-ized. Dan hari ini cukup banyak "metrik standar" ketika kita berbicara tentang kecepatan: "apakah itu skala?"
Untuk cpu murni, saya suka Fortran. Untuk apa pun yang berhubungan dengan IO, saya merasa lebih mudah untuk bekerja dengan C. (sulit dalam kedua kasus ini).
Sekarang tentu saja, untuk kode intensif matematika paralel Anda mungkin ingin menggunakan GPU Anda. Baik C dan Fortran memiliki banyak antarmuka CUDA / OpenCL yang terintegrasi dengan baik (dan sekarang OpenACC).
Jawaban saya yang cukup objektif adalah: Jika Anda tahu kedua bahasa sama baiknya / buruk maka saya pikir Fortran lebih cepat karena saya merasa lebih mudah untuk menulis kode paralel / didistribusikan dalam Fortran daripada C. (setelah Anda mengerti bahwa Anda dapat menulis "freeform" fortran dan bukan hanya kode F77 yang ketat)
Inilah jawaban ke-2 bagi mereka yang bersedia untuk menurunkan saya karena mereka tidak menyukai jawaban pertama: Kedua bahasa memiliki fitur yang diperlukan untuk menulis kode kinerja tinggi. Jadi itu tergantung dari algoritma yang Anda terapkan (intensif CPU? Intensif? Memori intensif?), Perangkat keras (CPU tunggal? Multi-core? Mendistribusikan superkomputer? GPGPU? FPGA?), Keterampilan Anda dan akhirnya kompiler itu sendiri. Baik C dan Fortran memiliki kompiler yang luar biasa. (Saya benar-benar kagum dengan betapa canggihnya kompiler Fortran tetapi begitu juga kompiler C).
PS: Saya senang Anda secara khusus mengecualikan lib karena saya punya banyak hal buruk untuk dikatakan tentang lran Forti GUI. :)
sumber
Saya melakukan beberapa matematika yang luas dengan FORTRAN dan C selama beberapa tahun. Dari pengalaman saya sendiri, saya dapat mengatakan bahwa FORTRAN kadang-kadang benar-benar lebih baik daripada C tetapi tidak untuk kecepatannya (seseorang dapat membuat C tampil secepat FORTRAN dengan menggunakan gaya pengkodean yang sesuai) tetapi lebih karena perpustakaan yang dioptimalkan dengan sangat baik seperti LAPACK, dan karena paralelisasi yang hebat. Menurut pendapat saya, FORTRAN benar-benar canggung untuk dikerjakan, dan keuntungannya tidak cukup baik untuk membatalkan kekurangan itu, jadi sekarang saya menggunakan C + GSL untuk melakukan perhitungan.
sumber
Setiap perbedaan kecepatan antara Fortran dan C akan lebih merupakan fungsi dari optimisasi kompiler dan pustaka matematika yang mendasarinya yang digunakan oleh kompiler tertentu. Tidak ada yang intrinsik pada Fortran yang akan membuatnya lebih cepat daripada C.
Bagaimanapun, seorang programmer yang baik dapat menulis Fortran dalam bahasa apa pun.
sumber
Saya belum pernah mendengar bahwa Fortan secara signifikan lebih cepat daripada C, tetapi mungkin dapat dibayangkan bahwa dalam kasus-kasus tertentu akan lebih cepat. Dan kuncinya bukan pada fitur bahasa yang ada, tetapi pada fitur yang (biasanya) tidak ada.
Contohnya adalah pointer C. Pointer C digunakan cukup banyak di mana-mana, tetapi masalah dengan pointer adalah bahwa kompiler biasanya tidak tahu apakah mereka menunjuk ke bagian yang berbeda dari array yang sama.
Misalnya jika Anda menulis rutin strcpy yang terlihat seperti ini:
Kompilator harus bekerja dengan asumsi bahwa d dan s mungkin tumpang tindih array. Jadi itu tidak dapat melakukan optimasi yang akan menghasilkan hasil yang berbeda ketika array tumpang tindih. Seperti yang Anda harapkan, ini sangat membatasi jenis optimasi yang dapat dilakukan.
[Saya harus mencatat bahwa C99 memiliki kata kunci "batasi" yang secara eksplisit memberi tahu kompiler bahwa pointer tidak tumpang tindih. Juga perhatikan bahwa Fortran juga memiliki pointer, dengan semantik berbeda dari C, tetapi pointer tidak ada di mana-mana seperti pada C.]
Tetapi kembali ke masalah C vs Fortran, bisa dibayangkan bahwa kompiler Fortran dapat melakukan beberapa optimasi yang mungkin tidak mungkin untuk program C (ditulis langsung). Jadi saya tidak akan terlalu terkejut dengan klaim itu. Namun, saya berharap bahwa perbedaan kinerja tidak akan terlalu banyak. [~ 5-10%]
sumber
Cepat dan sederhana: Keduanya sama-sama cepat, tetapi Fortran lebih sederhana. Whats benar-benar lebih cepat pada akhirnya tergantung pada algoritme, tetapi tidak ada perbedaan kecepatan yang berarti. Inilah yang saya pelajari dalam lokakarya Fortran di pusat komputasi kinerja tinggi Stuttgard, Jerman pada tahun 2015. Saya bekerja dengan Fortran dan C dan membagikan pendapat ini.
Penjelasan:
C dirancang untuk menulis sistem operasi. Karenanya ia memiliki lebih banyak kebebasan daripada yang dibutuhkan untuk menulis kode kinerja tinggi. Secara umum ini bukan masalah, tetapi jika seseorang tidak memprogram dengan hati-hati, seseorang dapat dengan mudah memperlambat kodenya.
Fortran dirancang untuk pemrograman ilmiah. Untuk alasan ini, mendukung penulisan kode sintaks cepat, karena ini adalah tujuan utama Fortran. Berbeda dengan opini publik, Fortran bukan bahasa pemrograman yang ketinggalan jaman. Standar terbarunya adalah 2010 dan kompiler baru diterbitkan secara berkala, karena sebagian besar kode kinerja tinggi ditulis di Fortran. Fortran lebih lanjut mendukung fitur modern sebagai arahan kompiler (dalam pragma C).
Contoh: Kami ingin memberikan struct besar sebagai argumen input untuk suatu fungsi (fortran: subroutine). Dalam fungsi argumen tidak diubah.
C mendukung keduanya, panggilan berdasarkan referensi dan panggilan berdasarkan nilai, yang merupakan fitur praktis. Dalam kasus kami, pemrogram mungkin secara tidak sengaja menggunakan panggilan berdasarkan nilai. Ini memperlambat banyak hal, karena struct harus disalin dalam memori terlebih dahulu.
Fortran hanya bekerja dengan panggilan dengan referensi, yang memaksa programmer untuk menyalin struct dengan tangan, jika dia benar-benar ingin panggilan dengan operasi nilai. Dalam kasus kami, fortran akan secara otomatis secepat versi C dengan panggilan dengan referensi.
sumber
Umumnya FORTRAN lebih lambat dari C. C dapat menggunakan pointer level perangkat keras yang memungkinkan programmer untuk mengoptimalkan tangan. FORTRAN (dalam banyak kasus) tidak memiliki akses ke peretasan yang menangani memori perangkat keras. (VAX FORTRAN adalah cerita lain.) Saya telah menggunakan dan mematikan FORTRAN sejak '70 -an. (Betulkah.)
Namun, mulai tahun 90-an FORTRAN telah berevolusi untuk memasukkan konstruksi bahasa tertentu yang dapat dioptimalkan menjadi algoritma paralel inheren yang benar - benar dapat berteriak pada prosesor multi-core. Misalnya, Vectorizing otomatis memungkinkan beberapa prosesor untuk menangani setiap elemen dalam vektor data secara bersamaan. 16 prosesor - 16 elemen vektor - pemrosesan membutuhkan 1/16 waktu.
Di C, Anda harus mengelola utas Anda sendiri dan mendesain algoritme Anda dengan cermat untuk multi-pemrosesan, dan kemudian menggunakan banyak panggilan API untuk memastikan bahwa paralelisme terjadi dengan benar.
Di FORTRAN, Anda hanya perlu merancang algoritme dengan cermat untuk multi-pemrosesan. Kompiler dan run-time dapat menangani sisanya untuk Anda.
Anda dapat membaca sedikit tentang High Performance Fortran , tetapi Anda menemukan banyak tautan mati. Anda sebaiknya membaca tentang Pemrograman Paralel (seperti OpenMP.org ) dan bagaimana FORTRAN mendukungnya.
sumber
Kode lebih cepat tidak benar-benar sampai ke bahasa, adalah kompiler sehingga Anda dapat melihat ms-vb "kompiler" yang menghasilkan kode objek yang membengkak, lebih lambat dan berlebihan yang diikat bersama di dalam ".exe", tetapi powerBasic menghasilkan terlalu kode yang lebih baik. Kode objek yang dibuat oleh kompiler C dan C ++ dihasilkan dalam beberapa fase (setidaknya 2) tetapi dengan desain sebagian besar kompiler Fortran memiliki setidaknya 5 fase termasuk optimasi tingkat tinggi sehingga dengan desain Fortran akan selalu memiliki kemampuan untuk menghasilkan kode yang sangat optimal. Jadi pada akhirnya adalah kompiler bukan bahasa yang harus Anda tanyakan, kompiler terbaik yang saya tahu adalah Intel Fortran Compiler karena Anda bisa mendapatkannya di LINUX dan Windows dan Anda dapat menggunakan VS sebagai IDE, jika Anda mencari kompiler tigh murah Anda selalu dapat menyampaikan pada OpenWatcom.
Info lebih lanjut tentang ini: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html
sumber
Fortran memiliki rutinitas I / O yang lebih baik, misalnya fasilitas yang tersirat memberikan fleksibilitas yang tidak dapat ditandingi oleh pustaka standar C.
Kompiler Fortran secara langsung menangani sintaks yang lebih kompleks yang terlibat, dan karena sintaks seperti itu tidak dapat dengan mudah direduksi menjadi bentuk lewat argumen, C tidak dapat mengimplementasikannya secara efisien.
sumber
Menggunakan standar dan kompiler modern, tidak!
Beberapa orang di sini telah menyarankan bahwa FORTRAN lebih cepat karena kompiler tidak perlu khawatir tentang aliasing (dan karenanya dapat membuat lebih banyak asumsi selama optimasi). Namun, ini telah ditangani dalam C sejak standar C99 (saya pikir) dengan memasukkan kata kunci pembatasan. Yang pada dasarnya memberitahu kompiler, bahwa dalam lingkup memberi, pointer tidak alias. Lebih lanjut C memungkinkan aritmetika pointer yang tepat, di mana hal-hal seperti aliasing dapat sangat berguna dalam hal kinerja dan alokasi sumber daya. Meskipun saya pikir versi FORTRAN yang lebih baru memungkinkan penggunaan pointer yang "tepat".
Untuk implementasi modern, C secara umum mengungguli FORTRAN (walaupun sangat cepat juga).
http://benchmarksgame.alioth.debian.org/u64q/fortran.html
EDIT:
Kritik yang adil terhadap hal ini adalah bahwa tolok ukurnya mungkin bias. Berikut adalah sumber lain (relatif terhadap C) yang menghasilkan lebih banyak konteks:
http://julialang.org/benchmarks/
Anda dapat melihat bahwa C biasanya mengungguli Fortran dalam banyak kasus (sekali lagi lihat kritik di bawah ini yang berlaku di sini juga); seperti yang dinyatakan orang lain, pembandingan adalah ilmu yang tidak eksak yang dapat dengan mudah dimuat untuk mendukung satu bahasa daripada yang lain. Tapi itu menempatkan dalam konteks bagaimana Fortran dan C memiliki kinerja yang serupa.
sumber
Fortran dapat menangani array, terutama array multidimensi, dengan sangat mudah. Mengiris elemen array multidimensi di Fortran bisa jauh lebih mudah daripada di C / C ++. C ++ sekarang memiliki pustaka yang dapat melakukan pekerjaan, seperti Boost atau Eigen, tetapi pustaka eksternal. Di Fortran fungsi-fungsi ini intrinsik.
Apakah Fortran lebih cepat atau lebih nyaman untuk dikembangkan sebagian besar tergantung pada pekerjaan yang harus Anda selesaikan. Sebagai orang komputasi ilmiah untuk geofisika, saya melakukan sebagian besar perhitungan di Fortran (maksud saya Fortran modern,> = F90).
sumber
Ini lebih dari agak subyektif, karena masuk ke kualitas penyusun dan semacamnya lebih dari apa pun. Namun, untuk lebih langsung menjawab pertanyaan Anda, berbicara dari sudut pandang bahasa / kompiler tidak ada apa-apa tentang Fortran di atas C yang akan membuatnya secara inheren lebih cepat atau lebih baik daripada C. Jika Anda melakukan operasi matematika yang berat, itu akan turun ke kualitas kompiler, keterampilan programmer dalam setiap bahasa dan perpustakaan dukungan matematika intrinsik yang mendukung operasi tersebut untuk akhirnya menentukan mana yang akan lebih cepat untuk implementasi yang diberikan.
EDIT: Orang lain seperti @Nils telah mengangkat poin bagus tentang perbedaan dalam penggunaan pointer di C dan kemungkinan untuk aliasing yang mungkin membuat implementasi yang paling naif lebih lambat di C. Namun, ada cara untuk menghadapinya di C99 , melalui flag optimisasi compiler dan / atau bagaimana C sebenarnya ditulis. Ini tercakup dengan baik dalam jawaban @Nils dan komentar selanjutnya yang mengikuti jawabannya.
sumber
Sebagian besar posting sudah menyajikan argumen yang meyakinkan, jadi saya hanya akan menambahkan 2 sen peribahasa ke aspek yang berbeda.
Menjadi fortran lebih cepat atau lebih lambat dalam hal kekuatan pemrosesan pada akhirnya dapat memiliki kepentingannya, tetapi jika dibutuhkan 5 kali lebih banyak waktu untuk mengembangkan sesuatu di Fortran karena:
Maka masalahnya tidak relevan. Jika ada sesuatu yang lambat, sebagian besar waktu Anda tidak dapat memperbaikinya melampaui batas yang diberikan. Jika Anda menginginkan sesuatu yang lebih cepat, ubah algoritma. Pada akhirnya, waktu komputer itu murah. Waktu manusia tidak. Nilai pilihan yang mengurangi waktu manusia. Jika itu menambah waktu komputer, biayanya tetap efektif.
sumber
I will just add the proverbial 2 cents to a different aspect
Fortran secara tradisional tidak menetapkan opsi seperti -fp: strict (yang ifort mengharuskan untuk mengaktifkan beberapa fitur di USE IEEE_arithmetic, bagian dari standar f2003). Intel C ++ juga tidak menetapkan -fp: ketat sebagai default, tetapi itu diperlukan untuk penanganan ERRNO, misalnya, dan kompiler C ++ lainnya tidak membuatnya mudah untuk mematikan ERRNO atau mendapatkan optimisasi seperti pengurangan simd. gcc dan g ++ mengharuskan saya untuk membuat Makefile agar tidak menggunakan kombinasi berbahaya -O3 -fast-math -fopenmp -march = asli. Selain masalah-masalah ini, pertanyaan tentang kinerja relatif ini menjadi lebih rewel dan tergantung pada aturan lokal tentang pilihan penyusun dan opsi.
sumber