C vs Fortran

Här diskuteras programmering och utveckling
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

C vs Fortran

Inlägg 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:

Kod: Markera allt

	integer	i
	do i=0,2147483647,1
	end do
	end
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... ;D
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Urban Anjar
Inlägg: 7306
Blev medlem: 05 nov 2006, 22:59
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Vickleby
Kontakt:

Re: C vs Fortran

Inlägg 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å?
Ubuntu från början: http://ubuntufranborjan.wordpress.com/
Vill påminna om den här lilla filmen http://video.google.com/videoplay?docid ... 522818645#
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: C vs Fortran

Inlägg 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... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: C vs Fortran

Inlägg 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
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: C vs Fortran

Inlägg 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... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: C vs Fortran

Inlägg 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 8)

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
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: C vs Fortran

Inlägg 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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: C vs Fortran

Inlägg 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
Rune.K
Inlägg: 6437
Blev medlem: 09 jul 2008, 17:19
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: C vs Fortran

Inlägg av Rune.K »

Utanför ämnet: vill bara prenumera på den här intressanta tråden... mvh Rune.K
Användarvisningsbild
bbauto
Inlägg: 1594
Blev medlem: 11 dec 2006, 17:58
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Bromölla

Re: C vs Fortran

Inlägg 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... :)
Användarvisningsbild
nicefinger
Inlägg: 1800
Blev medlem: 14 jul 2006, 08:18
OS: Annat GNU/Linux
Utgåva: 23.04 Lunar Lobster
Ort: Uddevalla

Re: C vs Fortran

Inlägg 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.
Kolsyrat gangesvatten, socker, målarfärgämne (sockerkulör), surhetsgivande medel (saltsyra), dioxin, konservmedel (E211), du-är-så-sötningsmedel (E952), arom, oxidationsmedel.
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

Re: C vs Fortran

Inlägg 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

Kod: Markera allt

System.out.println(i);
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.
Användarvisningsbild
micke_nordin
Inlägg: 1539
Blev medlem: 21 aug 2008, 17:03
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: C vs Fortran

Inlägg 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

Kod: Markera allt

System.out.println(i);
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
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: C vs Fortran

Inlägg 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.
jsiei97
Inlägg: 309
Blev medlem: 09 dec 2008, 21:34
OS: Xubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Trelleborg

Re: C vs Fortran

Inlägg 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
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: C vs Fortran

Inlägg 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:

Kod: Markera allt

	integer	i
	do i=0,2147483647,1
	end do
	end
[...]
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
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: C vs Fortran

Inlägg av per9000 »

per9000 skrev: [...]
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
[...]
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
--
Per Erik Strandberg
Yet Another IT Consultant
Skriv svar

Återgå till "Programmering och webbdesign"