Sida 1 av 1
C vs Fortran
Postat: 03 maj 2009, 21:49
av Osprey
För att för en gångs skull göra något konstruktivt så kunde jag inte låta bli att göra en test...
När jag började programmera så var Fortran fortfarande relativt vanligt, även om det mer eller mindre var på väg ut. Hur som helst så testades det ofta mot många modernare språk och i stort sett varenda gång vann Fortran iallafall när det gällde prestanda. Däremot är det ett rätt klumpigt språk att göra många andra saker med och det är definitivt inte lika bra som C att skriva systemnära saker i, även om det iofs till viss del funkar det med.
Nåväl nu fick jag för mig att göra en snabbtest igen, för att se om C hade utvecklats och blivit snabbare än Fortran nu.
För testet använde jag "gcc" som C-kompilator och "gfortran" som Fortran-kompilator och till saken hör faktiskt att gfortran numera är en del av gcc, så att så sett borde C och Fortran hamna väldigt nära varandra, kanske med ett litet plus för C som antagligen är det som är mest genomjobbat i gcc.
Som testprogram använde jag bara en liten enkel snurra för att testa prestanda under enklast möjliga former.
Koden för C-programmet var:
Kod: Markera allt
main()
{
int i;
for(i=0;i<2147483647;i++);
}
Och motsvarande för Fortran:
För att få lite tid på det och för att programaktiveringen inte skulle spela för stor roll så körde jag det 16 gånger. Detta tar bort en hel del av eventuellt olika tid för programaktivering genom att programmet tar betydligt längre tid att köra än att aktivera.
Tiderna jag fick fram för att köra respektive program var:
C-programmet:
Real = 139,790 s
User = 133,930 s
Sys = 0,510 s
Fortran-programmet:
Real = 112,300 s
USer = 108,530 s
Sys = 0,500 s
Ganska ordentligt mycket snabbare för Fortran än för C. De här tiderna ovan är uppmätta med Ubuntu igång som vanligt, men jag gjorde testet i singleuser-mode också, dvs. gjorde en recovery-boot och hoppade ut till rootprompt utan nätverk. Resultatet blev exakt detsamma då, även om båda programmen gick snabbare då, så blev skillnaden ungefär densamma.
Så...
Fortran is still alive and kicking... 
Re: C vs Fortran
Postat: 04 maj 2009, 08:11
av Urban Anjar
Av någon anledning verkar FÅR-TRAN fortfarande vara rätt poppis bland matematiker och fysiker. Kanske är det prestanda som gör det, kanske beprövade libbar, kanske att det är gamla beprövade program man hackar vidare på?
Re: C vs Fortran
Postat: 04 maj 2009, 09:45
av Osprey
När det gäller matematik så har Fortran en massa inbyggt direkt i språket, medan motsvarande i C har tillkommit på senare tid, men då mest som funktionsanrop.
Det lustiga i just det här fallet är att Fortran blir så ordentligt mycket snabbare (25%) för ett så här otroligt enkelt program som egentligen borde generera exakt samma assembler och maskinkod i båda fallen...
Hur som helst om jag kör "gcc -S" respektive "gfortran -S" så blir själva snurran i respektive språk:
C
Kod: Markera allt
movl $0, -4(%rbp)
jmp .L2
.L3:
addl $1, -4(%rbp)
.L2:
cmpl $2147483647, -4(%rbp)
jne .L3
leave
ret
Fortran
Kod: Markera allt
movl $0, -4(%rbp)
.L3:
cmpl $2147483647, -4(%rbp)
sete %al
movzbl %al, %eax
addl $1, -4(%rbp)
testl %eax, %eax
je .L3
.L4:
leave
ret
Som synes genererar Fortran lite mer(!) kod och all kod kring det hela (det jag inte tagit med här alltså) blir också lite mer i Fortran -
men snabbare...
Orsaken vet jag inte, men Fortran har alltid varit snabbare än C och är det tydligen fortfarande...

Re: C vs Fortran
Postat: 04 maj 2009, 10:13
av Konservburk
Det här var spännande. Jag har aldrig pysslat med fortran och det tog en stund innan jag fattade att gfortran vill ha minst 6 mellanrum i början av varje rad. Finns det någon anledning till det?
När det gäller själva testet så får jag precis motsatt resultat. C är 10-15% snabbare än Fortran. Vad kan det bero på? Har det med hårdvaran att göra? Eller kan det vara kompilatorversionen?
Kod: Markera allt
$ time ./c.out
real 0m8.203s
user 0m8.109s
sys 0m0.013s
$ time ./f.out
real 0m9.554s
user 0m9.426s
sys 0m0.010s
Re: C vs Fortran
Postat: 04 maj 2009, 10:29
av Osprey
Min hårdvara (den som borde vara intressant i det här fallet) är:
*-cpu
description: CPU
product: AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
vendor: Advanced Micro Devices [AMD]
physical id: 4
bus info: cpu@0
version: AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
slot: Socket AM2
size: 2100MHz
capacity: 3GHz
width: 64 bits
clock: 200MHz
capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp x86-64 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch cpufreq
*-cache:0
description: L1 cache
physical id: a
slot: Internal Cache
size: 128KiB
capacity: 128KiB
capabilities: synchronous internal write-back
Min kompilatorversion är (jag får samma resultat med både "gcc -v" och "gfortran -v"):
Använder inbyggda specifikationer.
Mål: x86_64-linux-gnu
Konfigurerad med: ../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Trådmodell: posix
gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
Orsaken till att Fortran vill ha mellanrum i början (en tab går lika bra numera), är att det från början utformades för hålkort och då fanns det styrkoder där...

Re: C vs Fortran
Postat: 04 maj 2009, 11:02
av Konservburk
Osprey skrev:Orsaken till att Fortran vill ha mellanrum i början (en tab går lika bra numera), är att det från början utformades för hålkort och då fanns det styrkoder där...

hehe, old school
Min gcc säger "Target: i686-linux-gnu", i övrigt är det samma version.
description: CPU
product: Intel(R) Core(TM)2 CPU 6300 @ 1.86GHz
vendor: Intel Corp.
physical id: 4
bus info: cpu@0
version: 6.15.2
slot: LGA 775
size: 1862MHz
capacity: 3800MHz
width: 64 bits
clock: 266MHz
capabilities: boot fpu fpu_exception wp vme de pse tsc msr pae mce cx8
apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht t
m pbe nx x86-64 constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl vmx
est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow
configuration: id=0
*-cache:0
description: L1 cache
physical id: 5
slot: L1-Cache
size: 32KiB
capacity: 32KiB
capabilities: internal write-back data
*-cache:1
description: L2 cache
physical id: 6
slot: L2-Cache
size: 2MiB
capacity: 2MiB
capabilities: internal write-back instruction
Re: C vs Fortran
Postat: 04 maj 2009, 11:35
av Osprey
Konservburk skrev:Min gcc säger "Target: i686-linux-gnu", i övrigt är det samma version.
Får du ungefär samma resultat som jag med "gcc -S" och "gfortran -S"..? Det borde bli det tycker jag...
Kul att C blev lite snabbare för dig förresten! På alla burkar jag provat på hittills under åren, så har Fortran alltid vunnit med c:a 10-30% på den här typen av enkla program. Lägger man till beräkningar och stränghantering etc. så brukar skillnaden bli ännu större...
Re: C vs Fortran
Postat: 04 maj 2009, 12:07
av Konservburk
Osprey skrev:Får du ungefär samma resultat som jag med "gcc -S" och "gfortran -S"..? Det borde bli det tycker jag...
Verkar vara hyffsat likt det du får...
C
Kod: Markera allt
movl $0, -8(%ebp)
jmp .L2
.L3:
addl $1, -8(%ebp)
.L2:
cmpl $2147483647, -8(%ebp)
jne .L3
Fortran
Kod: Markera allt
movl $0, -4(%ebp)
.L3:
cmpl $2147483647, -4(%ebp)
sete %al
movzbl %al, %eax
addl $1, -4(%ebp)
testl %eax, %eax
je .L3
.L4:
leave
ret
Re: C vs Fortran
Postat: 04 maj 2009, 12:40
av Rune.K
Utanför ämnet: vill bara prenumera på den här intressanta tråden... mvh Rune.K
Re: C vs Fortran
Postat: 04 maj 2009, 13:54
av bbauto
Funderar på att pröva Common LISP ja! Har bara programmerat AutoLISP innan (sitter o andra sidan i ryggmärgen), men ser att det är ganska populärt i unix/linux-världen...

Re: C vs Fortran
Postat: 04 maj 2009, 16:07
av nicefinger
Fortran används nog fortfarande till tekniska och matematiska beräkningar. Finns enorma programbibliotek för olika matematiska funktioner att tillgå. Jag använde dom under min enda erfarenhet av mera avancerad programering, när jag gick på chalmers.
Matrisoperationer mest i mitt fall. En del var programmerade i Fortran-66 till och med, alltså mycket gamla. Det lite lustiga är att dom är fritt tillgängliga, som källkod .. vet inte hur det rent legalt ser ut, men jag hade i alla fall lätt kunnat kopiera ner biblioteken och spridit dom.
Re: C vs Fortran
Postat: 04 maj 2009, 18:52
av TicToc
Förlåt mig om jag avviker från ämnet, men är det något jag har missuppfattat?
Gjorde samma? sak i Java och fick ett lite annorlunda resultat.
Kod: Markera allt
package cfj;
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 2147483647; i++) {
}
}
}
time java -jar cfj.jar
real 0m0.132s
user 0m0.087s
sys 0m0.026s
Om jag i lopen lägger till
tar det mig
real 0m27.688s
user 0m11.354s
sys 0m12.539s
att skriva ut
4001843 rader.
Edit: Kan tillägga att ett tomt program tar lika lång tid att köra som en tom for-sats.
Re: C vs Fortran
Postat: 04 maj 2009, 20:32
av micke_nordin
TicToc skrev:Förlåt mig om jag avviker från ämnet, men är det något jag har missuppfattat?
Gjorde samma? sak i Java och fick ett lite annorlunda resultat.
Kod: Markera allt
package cfj;
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 2147483647; i++) {
}
}
}
time java -jar cfj.jar
real 0m0.132s
user 0m0.087s
sys 0m0.026s
Om jag i lopen lägger till
tar det mig
real 0m27.688s
user 0m11.354s
sys 0m12.539s
att skriva ut
4001843 rader.
Edit: Kan tillägga att ett tomt program tar lika lång tid att köra som en tom for-sats.
Du får köra C och fortranversionerna också på samma burk för jämförelse, detta borde vara rätt hårdvaruberoende.
/Micke
Re: C vs Fortran
Postat: 04 maj 2009, 20:45
av Konservburk
TicToc skrev:Edit: Kan tillägga att ett tomt program tar lika lång tid att köra som en tom for-sats.
Det är en optimering som java gör. C-programmet blir precis lika snabbt om du kompilerar det med
gcc -O2 istället. Det är ju inte speciellt svårt att räkna ut att en sådan loop med fördel rakt av kan
ersättas med
i=2147483647 utan att resultatet påverkas.
Re: C vs Fortran
Postat: 05 maj 2009, 07:49
av jsiei97
Konservburk skrev:TicToc skrev:Edit: Kan tillägga att ett tomt program tar lika lång tid att köra som en tom for-sats.
Det är en optimering som java gör. C-programmet blir precis lika snabbt om du kompilerar det med
gcc -O2 istället. Det är ju inte speciellt svårt att räkna ut att en sådan loop med fördel rakt av kan
ersättas med
i=2147483647 utan att resultatet påverkas.
Jag tror att ni måste göra en verklig beräkning för att få något ni kan jämföra.
Självklart måste ni använda kompilatoroptimeringar som t.ex. -O3 för att få ut det mesta ut t.ex. C.
Ni skulle kunna välja något från
http://projecteuler.net/,
där verkar finnas många roliga små problem man kan lösa...
Och alla har en matematisk prägel så fortran borde ha en bra chans???
/Johan
Re: C vs Fortran
Postat: 26 maj 2009, 09:31
av per9000
1 - Läsbarhet spelar roll för mig:
C 1up!
Osprey skrev:
[...]
Koden för C-programmet var:
Kod: Markera allt
main()
{
int i;
for(i=0;i<2147483647;i++);
}
Och motsvarande för Fortran:
[...]
Men ok, det är lätt att skriva ful C-kod också, se
https://secure.wikimedia.org/wikipedia/ ... cated_code
2 - objektorienterad kod funkar i FORTRAN:
Fortan 1up
3 - Vad använder andra?
kolla in sida "15" i Measuring Libre Software using Debian 3.1 (Sarge) as a Case Study:
http://gsyc.escet.urjc.es/~jjamor/resea ... erraiz.pdf
ansi C dominerar i Debian, följt av c++, lisp, sen bash och så "other"
Ergo:
C 1up
Min slutsats:
C dominerar över FORTRAN. Men jobbar man med matematiker och fysiker så kan FORTRAN vara bra att kunna.
/P
Re: C vs Fortran
Postat: 26 maj 2009, 09:43
av per9000
En av tabellerna. C toppar på 57% och FORTRAN ligger på 1,2% av all källkod i HELA Debian 3.1 (inklusive Open Office etc).
C - 130,847,000 lines = 57 %
C++ - 38,602,000 lines = 16.8 %
Shell - 20,763,000 lines = 9 %
LISP - 6,919,000 lines = 3 %
Perl - 6,415,000 lines = 2.8 %
Python - 4,129,000 lines = 1.8 %
Java - 3,679,000 lines = 1.6 %
FORTRAN - 2,724,000 lines = 1.2 %
PHP - 2,144,000 lines = 0.93 %
Pascal - 1,423,000 lines = 0.62 %
Ada - 1,401,000 lines = 0.61 %
TOTALS - 229,496,000 lines = 100 %
/P