Apakah Fortran lebih mudah dioptimalkan daripada C untuk perhitungan berat?

410

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.

quinmars
sumber
53
Sangat subyektif dari jawaban yang diberikan di bawah ini. Judul yang benar adalah "Apakah ada alasan arsitektur mendasar mengapa kompiler Fortran MUNGKIN menghasilkan kode optomised yang lebih baik daripada kompiler C" tapi itu hanya menjadi pemetik.
Martin Beckett
3
Pertanyaan judul tidak begitu subyektif karena itu adalah kesalahpahaman, saya pikir. Pertanyaan yang lebih terperinci tidak subyektif.
jfm3
1
Saya tidak berpikir siapa pun akan belajar banyak dari ini selain jawabannya adalah "Ya" dan "Tidak" pada saat yang sama, dan bervariasi berdasarkan kompiler, sumber, CPU, tata letak memori, dll. Dll. Menguap.
user7116
1
Saya tidak berpikir bahwa pertanyaan atau jawabannya subjektif. Tetapi jika Anda berpikir bahwa bendera ini membantu siapa pun, saya setuju.
quinmars
2
@sixlettervariables walaupun Anda dan saya sudah tahu jawabannya, ini adalah pertanyaan yang terjadi pada kebanyakan orang di awal karier mereka dan penting untuk memahami jawabannya. Daripada mengirim komentar yang meremehkan mengapa tidak menemukan jawaban yang Anda setujui dan berikan +1
MarkJ

Jawaban:

447

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:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

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 intpointer!). 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, restrictkata 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 a double*tidak akan tumpang tindih dengan int*(dengan pengecualian khusus char*dan void*dapat tumpang tindih dengan apa pun).

Jika Anda menggunakannya, Anda akan mendapatkan kecepatan yang sama dari C dan Fortran. Namun, kemampuan untuk menggunakan restrictkata 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.

Nils Pipenbrinck
sumber
26
Semua benar dan valid, jeff. Namun, saya tidak menganggap "menganggap tidak ada aliasing" aman. Itu dapat memecahkan kode yang diwarisi dari proyek lain dengan cara yang sangat halus sehingga saya lebih suka tidak menggunakannya. Saya telah menjadi pembatasan-nazi karena alasan itu :-)
Nils Pipenbrinck
3
Untuk poin kedua saya, Anda tidak perlu menggunakan saklar kompiler alias alias. Cukup tulis kode sehingga beban berbasis pointer ditugaskan ke dalam variabel otomatis terlebih dahulu dan kemudian bekerja dengan otomatis dari sana. Ini akan terlihat lebih verbose, tetapi akan dioptimalkan dengan sempurna oleh kompiler.
Tall Jeff
33
Contoh yang baik adalah keberadaan memcpy () vs memmove (). Tidak seperti memcpy (), memmove () berupaya dengan area yang tumpang tindih, oleh karena itu memcpy () dapat lebih cepat daripada memmove (). Masalah ini adalah alasan yang cukup bagi seseorang untuk memasukkan dua fungsi alih-alih satu ke pustaka standar.
jfs
12
Saya pikir itu adalah poin dari Sebastian - karena kompleksitas / fleksibilitas penanganan memori C, bahkan sesuatu yang sederhana seperti memindahkan memori itu rumit.
Martin Beckett
3
Anda call transformmisalnya tidak memiliki banyak akal.
Vladimir F
163

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.)

Jaredor
sumber
1
tautan: web.archive.org/web/20090401205830/http : //ubiety.uwaterloo.ca/... tidak lagi berfungsi. Apakah ada tautan alternatif?
nathanielng
64

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:

matmul(a,b)

Norma L2 dari vektor x adalah:

sqrt(sum(x**2))

Selain itu pernyataan seperti FORALL, PURE& ELEMENTALprosedur 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.

pengguna49734
sumber
1
The forallkonstruk sudah ditinggalkan karena compiler tidak bisa mengoptimalkan kode baik. Penggantinya adalah do concurrent. Juga, kode sqrt(sum(x**2))terlihat tidak efisien, karena kompiler mungkin membangun seluruh vektor x**2. Saya akan menebak bahwa loop lebih baik, tetapi tidak diragukan lagi yang terbaik untuk memanggil norm2fungsi intrinsik .
A. Hennink
39

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.

Hossein Talebi
sumber
8
Bisakah Anda menambahkan sumber, pengalaman khusus, atau lembaga ilmiah / agensi komputasi kinerja tinggi yang bergerak menjauh dari C ++ untuk proyek masa depan atau menulis ulang proyek c ++ ke bahasa lain. Saya hanya bertanya karena saya tahu setidaknya dua lembaga ilmiah, Sandia dan CERN, yang banyak menggunakan c ++ untuk pemodelan kinerja tinggi mereka. Selain itu Sandia mengkonversi salah satu perangkat lunak pemodelan mereka (LAMMPS) dari fortran ke c ++ menambahkan sejumlah perangkat tambahan yang mengagumkan.
Zachary Kraus
7
LAMMPS ditulis dalam C ++ yang sangat sederhana yang tidak memanfaatkan sebagian besar fitur modern bahasa. Ini mewakili C ++ yang programmer Fortran yang tahu C menulis setelah belajar C ++ 98. Ini bukan untuk mengatakan LAMMPS ditulis dengan buruk, hanya saja itu bukan contoh yang ingin Anda kutip ketika mengadvokasi C ++ di HPC.
Jeff
30

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.

Greg Rogers
sumber
1
"tetapi kemungkinan Anda akan melihat manfaat yang sama dengan { 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.
Jon Harrop
Saya tidak yakin saya setuju dengan alasan utama Anda. Saya pribadi suka menggunakan fortran untuk kode berat matematika di mana array dan fungsi matematika adalah bagian terpenting dari kode. Tapi saya tahu pasti di banyak lembaga pemerintah dan bank mereka terus menggunakan fortran untuk mempertahankan atau memperluas kode warisan. Saya pribadi menggunakan fortran untuk memperpanjang kode profesor di Ph.D. panitia menulis.
Zachary Kraus
Pernyataan Anda, "alasan utama untuk menggunakan Fortran saat ini adalah mempertahankan atau memperluas aplikasi warisan", sepenuhnya salah. Saya belum melihat bahasa pemrograman lain yang bahkan dekat dengan fitur yang disediakan Fortran, terutama untuk aplikasi Matematika. Anda telah menyebutkan beberapa dari mereka, seperti dukungan array yang luar biasa, built-in aritmatika kompleks, fungsi murni atau elemen - dan saya bisa menyebutkan lebih banyak juga. Itu saja sudah cukup untuk membuktikan pernyataan Anda di atas salah.
Pap
28

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.

jakobengblom2
sumber
25

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:

  • Fortran harus bersaing dengan Assembly pada hari ketika beberapa bersumpah untuk tidak pernah menggunakan kompiler, jadi itu dirancang untuk kecepatan. C dirancang agar fleksibel.
  • Ceruk Fortran memiliki angka. Dalam kode domain ini tidak pernah cukup cepat. Jadi selalu ada banyak tekanan untuk menjaga bahasa tetap efisien.
  • Sebagian besar penelitian dalam optimisasi kompiler dilakukan oleh orang-orang yang tertarik untuk mempercepat kode angka Fortran, sehingga mengoptimalkan kode Fortran adalah masalah yang jauh lebih dikenal daripada mengoptimalkan bahasa kompilasi lainnya, dan inovasi baru muncul di kompiler Fortran terlebih dahulu.
  • Biggie : C mendorong penggunaan pointer lebih banyak daripada Fortran. Ini secara drastis meningkatkan cakupan potensial dari setiap item data dalam program C, yang membuatnya jauh lebih sulit untuk dioptimalkan. Perhatikan bahwa Ada juga jauh lebih baik daripada C di bidang ini, dan merupakan Bahasa OO yang jauh lebih modern daripada Fortran77 yang umum ditemukan. Jika Anda ingin langauge OO yang dapat menghasilkan kode lebih cepat dari C, ini merupakan opsi untuk Anda.
  • Karena ceruknya yang terus bertambah banyak, para pelanggan kompiler Fortran cenderung lebih peduli pada optimisasi daripada para pelanggan kompiler C.

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

TED
sumber
4
Saya setuju. Dan boleh saya tambahkan bahwa ketika Fortran diperkenalkan (itu adalah bahasa tingkat tinggi pertama) di akhir 50-an awal 60-an banyak yang skeptis tentang seberapa efisien itu bisa. Oleh karena itu pengembangnya harus membuktikan bahwa Fortran dapat menjadi efisien dan berguna dan mulai "mengoptimalkannya sampai mati" hanya untuk membuktikan maksud mereka. C datang jauh kemudian (awal hingga pertengahan 70-an) dan tidak ada yang bisa dibuktikan, bisa dikatakan. Tetapi pada saat ini banyak kode Fortran telah ditulis sehingga komunitas ilmiah tetap menggunakannya dan masih melakukannya. Saya tidak memprogram Fortran tapi saya sudah belajar menautkan untuk memanggil subrutin Fortran dari C ++.
Olumide
3
Penelitian tentang optimisasi kompiler lebih beragam daripada yang Anda pikirkan. Sejarah implementasi LISP, misalnya, penuh dengan keberhasilan dalam melakukan penghitungan angka lebih cepat dari Fortran (yang tetap merupakan pesaing baku untuk ditantang). Juga, sebagian besar optimasi kompiler telah menargetkan representasi perantara dari kompiler, yang berarti bahwa, perbedaan dalam semantik samping (seperti aliasing), mereka berlaku untuk bahasa pemrograman dari kelas tertentu.
Nowhere man
2
Idenya diulangi berulang-ulang, tetapi agak tidak jujur ​​untuk mengatakan bahwa tidak ada konsekuensi untuk efisiensi yang melekat pada desain bahasa pemrograman. Beberapa fitur bahasa pemrograman harus mengarah pada inefisiensi karena mereka membatasi informasi yang tersedia pada waktu kompilasi.
Praxeolitic
@Praxeolitic - Itu cukup benar (itulah sebabnya saya senang saya tidak mengatakan hal seperti itu).
TED
@ TED Jujur, kembali ke sini beberapa bulan kemudian saya tidak tahu mengapa saya meninggalkan komentar itu pada jawaban Anda. Mungkin aku bermaksud meninggalkannya di tempat lain? XP
Praxeolitic
22

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"):

-fcx-fortran-rules Penggandaan dan pembagian yang kompleks mengikuti aturan Fortran. Pengurangan jangkauan dilakukan sebagai bagian dari divisi kompleks, tetapi tidak ada pengecekan apakah hasil dari perkalian kompleks atau divisi adalah "NaN + I * NaN", dengan upaya untuk menyelamatkan situasi dalam kasus tersebut.

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
Apa yang ada untuk "penyelamatan" yang berarti dalam kasus Nan + INan? Apa yang membuat infinitas berbeda dari NaN adalah bahwa infinitas ditandatangani. Operasi yang melibatkan infinitas non-kompleks yang akan menghasilkan tanda kacau menghasilkan NaN dan saya tidak melihat alasan bilangan kompleks harus melakukan sebaliknya. Jika satu kelipatan (DBL_MAX, DBL_MAX) dengan (2,2), kuadratkan hasilnya, dan kemudian kuadratkan hasilnya, apa yang seharusnya menjadi tanda hasil dengan tidak adanya overflow? Apa yang bukan merupakan kelipatan dari (1.001, DBL_MAX)? Saya menganggap (NaN, NaN) sebagai jawaban yang benar, dan setiap kombinasi infinity dan NaN tidak masuk akal.
supercat
14

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.

jfm3
sumber
11
Hampir mengubah ini. Masalahnya adalah bahwa Fortran memang memiliki beberapa keunggulan yang melekat. Namun, Anda cukup yakin bahwa hal yang penting untuk dilihat adalah compier, bukan bahasa.
TED
14

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
Terjemahan buruk diperlukan untuk mengatasi masalah aliasing. Anda harus memberikan variabel tiruan kompiler untuk memberi tahu bahwa variabel byref diimplementasikan sebagai pointer dapat dioptimalkan register.
David
12

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. :)

ker2x
sumber
11

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.

grzkv
sumber
10

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.

Kluge
sumber
@ Esccott Clawson: Anda mendapat -1 dan saya tidak tahu mengapa. +1 akan memperbaiki ini. Namun, yang perlu dipertimbangkan adalah Fortran telah ada lebih lama daripada banyak orang tua kita. Banyak waktu yang dihabiskan untuk mengoptimalkan keluaran kompiler: D
user7116
Saya setuju. Saya baru saja memposting jawaban yang sangat mirip secara paralel.
Tall Jeff
Pointer alias masalah di C telah diangkat oleh orang lain, tetapi ada beberapa metode yang dapat digunakan programmer pada kompiler modern untuk menghadapinya, jadi saya masih setuju.
Tall Jeff
1
@ Kluge: "Tidak ada yang intrinsik untuk Fortran yang akan membuatnya lebih cepat daripada C". Pointer aliasing, mengembalikan nilai majemuk dalam register, built-in konstruk numerik tingkat tinggi ...
Jon Harrop
9

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:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

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%]

Pramod
sumber
9

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.

Markus Dutschke
sumber
Bisakah Anda menulis aplikasi paralel asli dalam C (artinya, tanpa memanggil perpustakaan?). Tidak. Bisakah Anda menulis aplikasi paralel asli di Fortran? Ya, dengan beberapa cara berbeda. Ergo, Fortran "lebih cepat". Meskipun, untuk bersikap adil, pada tahun 2010 ketika Anda menulis komentar Anda, dukungan untuk fitur paralel dan fitur co-array Fortran mungkin tidak seluas seperti sekarang.
Mali Remorker
@MaliRemorker Dia menulis ini pada tahun 2016, bukan pada tahun 2010.
Kowalski
Biaya pembuatan proses paralel menurut saya bukan faktor yang paling relevan untuk bahasa pemrograman yang disebut 'cepat'. Yang lebih relevan adalah pertimbangan praktis, seperti ketenangan kode yang tidak memiliki kinerja. Jadi itu tidak membantu apa-apa jika Anda menghemat waktu satu kali (saat membuat proses paralel) dan membuangnya pada banyak core nanti. Istilah 'cepat' juga harus mempertimbangkan kode non-paralel. Karena alasan ini, saya tidak dapat melihat argumen yang bertentangan dengan maksud saya. Mungkin komentar Anda adalah jawaban independen?
Markus Dutschke
8

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.

S.Lott
sumber
6
@ S.Lott: Saya tidak bisa membayangkan betapa mengerikannya kode C harus dilakukan sebaik menulis Fortran untuk sebagian besar kode yang kami miliki di sini ... dan saya seorang programmer C. Anda akan mendapatkan kinerja yang lebih baik dari kode yang lebih sederhana di Fortran. Bukan berarti Anda atau saya tidak dapat menemukan contoh tandingan. : D
user7116
2
@ Greg Rogers: Anda harus menyelesaikan masalah Anda dengan orang-orang Fortran Vectorization, bukan saya. Saya hanya melaporkan apa yang saya baca. polyhedron.com/absoftlinux
S.Lott
2
-1 // "Umumnya FORTRAN lebih lambat dari C. Ini berlaku untuk hampir semua hal." Mengapa? // argumen yang didasarkan pada kemudahan menggunakan multi-threading di Fortran vs C tidak mengatakan sesuatu tentang kinerja.
steabert
4
@ S.Lott: "multi-threading hanya ada untuk kinerja". Err, tidak.
Jon Harrop
4
@ S.Lott: "Penggunaan pointer C hampir di tingkat perangkat keras memungkinkan C lebih cepat dari Fortran". Err, tidak
Jon Harrop
5

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

JPerez45
sumber
3

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.

Zeus
sumber
1
Apakah Anda memiliki tolok ukur yang menunjukkan Fortran mengalahkan C untuk I / O?
Jeff
3

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.

cdcdcd
sumber
4
Orang akan bodoh mempercayai apa pun tentang Fortran dari pos yang menganggapnya masih FORTRAN. Itu berubah lebih dari 25 tahun yang lalu. Tes tersebut tidak dapat membandingkan bahasa, karena mereka menggunakan kompiler dari vendor yang berbeda meskipun Intel dan GCC memiliki kompiler untuk C dan Fortran. Karena itu perbandingan itu tidak berharga.
Vladimir F
2

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).

Kai
sumber
1
Dan juga apakah Fortran lebih cepat juga tergantung pada: kompiler yang Anda gunakan (itu penting!), Untuk pekerjaan perhitungan apakah Anda menerapkan paralelisasi yang sesuai dengan kode, dan bagaimana kode Anda ditulis.
Kai
1

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.

Jeff tinggi
sumber
Kedengarannya seperti tes tolok ukur suatu algoritma. Yang membutuhkan waktu lebih sedikit, FORTRAN atau C? Tidak terdengar subjektif bagi saya. Mungkin saya melewatkan sesuatu.
S.Lott
1
Tidak setuju. Anda membandingkan kompiler, bukan bahasa. Saya pikir pertanyaan aslinya adalah apakah ada sesuatu tentang LANGUAGE yang membuatnya menjadi lebih baik secara inheren. Jawaban lain di sini masuk ke beberapa perbedaan yang dipertanyakan secara halus, tetapi saya pikir kita paling setuju mereka ada dalam kebisingan.
Tall Jeff
Ini bukan analisis algoritma O (n). Ini Performa. Jangan melihat bagaimana kinerja dapat menjadi konsep implementasi-independen yang hipotetis. Kira saya kehilangan sesuatu.
S.Lott
1
-1: "tidak ada apa-apa tentang Fortran di atas C yang akan membuatnya secara inheren lebih cepat atau lebih baik daripada C". Err, tidak.
Jon Harrop
0

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:

  • tidak memiliki perpustakaan yang baik untuk tugas-tugas yang berbeda dari angka murni
  • tidak memiliki alat yang layak untuk dokumentasi dan pengujian unit
  • itu adalah bahasa dengan ekspresivitas yang sangat rendah, meroketnya jumlah baris kode.
  • ini memiliki penanganan string yang sangat buruk
  • ia memiliki sejumlah masalah yang tidak masuk akal di antara berbagai kompiler dan arsitektur yang membuat Anda gila.
  • ini memiliki strategi IO yang sangat buruk (BACA / MENULIS file berurutan. Ya, file akses acak ada tetapi apakah Anda pernah melihatnya digunakan?)
  • itu tidak mendorong praktik pembangunan yang baik, modularisasi.
  • tidak adanya kompiler opensource yang sepenuhnya standar dan sepenuhnya memenuhi syarat (baik gfortran dan g95 tidak mendukung semuanya)
  • interoperabilitas yang sangat buruk dengan C (mangling: satu garis bawah, dua garis bawah, tidak ada garis bawah, secara umum satu garis bawah tetapi dua jika ada garis bawah lain. dan jangan biarkan menggali ke dalam blok UMUM ...)

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.

Stefano Borini
sumber
3
downvoted karena walaupun Anda meningkatkan poin menarik yang menambah diskusi tentang manfaat / kelemahan fortrans versus bahasa lain (yang saya tidak sepenuhnya setuju dengan), ini sebenarnya bukan jawaban untuk pertanyaan ...
steabert
@steabert: pada kenyataannya, saya katakanI will just add the proverbial 2 cents to a different aspect
Stefano Borini
1
+1 dari saya untuk beberapa jawaban tidak-rewel. Seperti yang Anda katakan, Fortran mungkin lebih cepat dalam beberapa tugas langka (belum melihat secara pribadi). Tetapi jumlah waktu yang Anda habiskan untuk mempertahankan bahasa yang tidak dapat dipelihara merusak kemungkinan yang ada.
André Bergner
10
-1. Anda tampaknya memikirkan Fortran dalam hal F77. Itu digantikan oleh F90, F95, F03, dan F08.
Kyle Kanos
4
Turun karena berbicara secara eksklusif tentang satu sisi pertukaran. Kecepatan pengembangan mungkin penting untuk sebagian besar pemrograman umum, tetapi itu tidak menjadikannya satu-satunya trade-off yang valid. Programmer Fortran sering ilmuwan / insinyur yang menghargai kesederhanaan bahasa (FORmula TRANslation sangat mudah dipelajari dan dikuasai. C / C ++ tidak ), perpustakaan yang sangat baik (sering digunakan dari bahasa lain), dan kecepatan (misalnya simulasi cuaca itu butuh berhari-hari di Fortran, tetapi berbulan-bulan jika ditulis seluruhnya dalam bahasa lain).
BraveNewCurrency
-3

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.

tim18
sumber
Pembaruan gcc terbaru memperbaiki masalah dengan kombinasi Openmp dan matematika cepat.
tim18
Jawaban ini sebenarnya tentang pengguna yang tidak memahami flag default untuk kompiler mereka, bukan bahasa itu sendiri.
Jeff