» »

Najhitrejši programski jezik?

Najhitrejši programski jezik?

«
1
2

DavidJ ::

Kateri je?

Imam težavo. Algoritem za iskanje praštevil smo testiral v več jezikih.

Merili smo čas, ki ga stvarca porabi, da poišče prvih 20.000 praštevil. Rezultati so pa nekaj nenavadnega:

- Java: 5.5s :\
- VB.NET: 3.0s
- VB 6.0: 1,8s 8-O
- C: 53s (a smo tu šli le doprvih 10.000 praštevil).

Kaj je VB res najhitrejši? 8-O
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')

MUC ::

Pa kdo je testiral na Cju 53 sek .. LOL ..

Test je zame nerelevanten, ker to sfiži tudi vse ostale rezultate :)

Monster ::

probite se na linux testirat....
Ka zaboga...

DavidJ ::

Primer za C, Javo in VB je podan v linku. Lahko sam stestiraš.
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')

asPeteR ::

Jaz bi pa raje algoritem cez Critticall spustu ...:)
http://blog.stegnar.com

Thomas ::

Delam na tem ... :D
Man muss immer generalisieren - Carl Jacobi

jeti51 ::

In zakaj gre for zanka v C-ju namesto do korena števila kar do prime-1?

Res zelo objektiven test.|O

Gandalfar ::

gcc version 3.3.1 20030728 (Debian prerelease)
Last prime: 36de7

Time: 1269693.143767 s navadn make z printf
Time: 1264752.703519 s navadn make brez printf od tu naprej so vsi rezultati brez printf
Time: 1546906.735467 s -O2
Time: 1549102.486688 s -O3

real 0m28.119s

java version "1.4.1"
Java™ 2 Runtime Environment, Standard Edition (build Blackdown-1.4.1-beta)
Java HotSpot™ Client VM (build Blackdown-1.4.1-beta, mixed mode)

224743
501 ms

real 0m0.747s

v obeh datotekah sem howmuch popravil na 20000



tole mi je cudn .. pomojem je C program cudn ..

kyon ::

VB 6.0 je zagotovo pocasnjesi od C-ja. Sem probal program za integriranje pognati v VB in C-ju in ni nobene primerjave. Sicer vam rezultatov ne morem pokazati, ker jih nimam vec, testirati se mi pa ponovno ne da, lahko povem, da je bila razlika ocitna. Pa se to pri VB je sklad bistveno manjsi kot pri C-ju. Men se zdi, da se je rekurzija v VB-ju poglobila okoli 10000x, pri C-ju pa cez 50000x. Toliko o zmogljivosti VB 6.0. Zelo dober clanek on zmogljivostih Visual Studio .net lahko preberete na http://www.directx4vb.com/ pod product reviews.
Med drugimi je testiral tudi VB 6.0

andrej ::

zdi se mi, da je to jako odvisno od samega prevajalnika in opcij/optimizacij, ki ji prevajalnik pozna. poskusi to na drugem OS-u, z drugim prevajalnikom, z drugimi opcijami in drugimi procesorji...

"najhitrejsi" programski jezik je tudi odvisen od samega znanja programerja in raznih trikov, ki se jih posluzi...

Fury ::

nemogoce da bi bil C vec kot 10x pocasnejsi.. ni sanse... neki je narobe s kodo al pa je compiler tak k sleep(1000) avtomatsko not mece :P

Vesoljc ::

differ = (stopTime - startTime)/18.217;
CLOCKS_PER_SEC?

nej eden nardi meritev z high performace counter-jem (QueryPerformanceCounter)...
meni se res ne da :)
Abnormal behavior of abnormal brain makes me normal...

Senitel ::

Ko zadevo popraviš, da dejansko počne v vseh primerih isto (zakaj zaboga mora C izpisovat po konzoli? In hodit do prime-1 namesto sqrt(prime)?)...
Meni Java verzija naredi zadevo v 410ms, C verzija (VC++ 6.0) pa v 195ms, VB-ja pa nimam.

P.S.: Originalni "timer" trdi, da je celotna zadeva potrebovala 10s :\, bom kar QueryPerformanceCounter-ju verjel...

Zgodovina sprememb…

  • spremenil: Senitel ()

BigWhale ::

[root@lala root]# gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[root@lala root]# gcc -o a a.c -lm
[root@lala root]# time ./a
Last prime: 224743
Time: 64774.661031 s

real 0m1.184s
user 0m1.180s
sys 0m0.000s
[root@lala root]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 3
cpu MHz : 701.601
cache size : 256 KB

Torej na P3 700. Po tem, ko sem program malo popravil in sicer, da ne izpisuje prastevil in da v tisti for zanki ne hodi do prime-1 ampak tako kot vsi ostali do sqrt(prime)

Torej, program se izvaja eno sekundo in en prdec.

Thomas ::

Tisto je problem, kar je povedal najprej jeti.

sqrt!

:)
Man muss immer generalisieren - Carl Jacobi

napsy ::

[luka@luka luka]$ g++ prime.c -O2 -o prime
[luka@luka luka]$ time ./prime

real 0m4.467s
user 0m3.850s
sys 0m0.050s
[luka@luka luka]$ cat /proc/cpuinfo
vendor_id : AuthenticAMD
cpu family : 6
model : 4
model name : AMD Athlon(tm) processor
stepping : 2
cpu MHz : 1200.054
cache size : 256 KB
---------------------
Heh, moj algoritem, ki pride do 1000000 praštevil :>
"If you die, you die. But when you live you live. There is no time to waste."

BigWhale ::

Napsy: slo se je za primerjavo enega algoritma v razlicnih jezikih ;) Koga briga tvoj algoritem :P

napsy ::

Sicer je pa na strani http://www.utm.edu/research/primes/prov...
opisan najhitrejši algoritem za iskanje praštevil.

Lah bi kdo primerju prejšnje s tem na različnih jezikih.
"If you die, you die. But when you live you live. There is no time to waste."

Zgodovina sprememb…

  • spremenil: napsy ()

krho ::

Kaj je VB res najhitrejši?

Ne.>:D >:D

----------
procedure TForm1.Button1Click(Sender: TObject);
var howMuch:Longword;
var i,j:Longword;
var found:Boolean;
var t1,t2,frekv:Int64;
begin

QueryPerformanceFrequency(frekv);
QueryPerformanceCounter(t1);

j:=3;
found:=True;
howMuch:=StrToInt(txtPrime.text);


while howMuch > 0 do begin
//delphi ne podpira step v for zanki zato uporabimo while
//for i:= 3 to sqr(j) Step 2
i:=3;
while i <= sqrt(j) do begin
if j mod i = 0 then begin
found:= False;
break; //exit inner while
end;
Inc(i,2);
end;//while

if found then Dec(howMuch)
else found:=True;
j:=j+2;
end;//while

lblPrime.Caption:=IntToStr(j - 2);
QueryPerformanceCounter(t2);
lblTime.Caption:= 'Time: ' + FloatToStr((t2-t1) / frekv);
end;

-----------------

Delphi 6.0 je hitrejši >:D >:D >:D
prvih 20.000 v ~320-340ms
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

Zgodovina sprememb…

  • spremenil: krho ()

krho ::

VB 6.0 578ms
sedaj za C pa ce kodo popravis, da gre do sqrt mi vrže ven 44 sekund, vendar to definitivno ni to, ker je zadeva narejena skoraj v trenutku,
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

napsy ::

"If you die, you die. But when you live you live. There is no time to waste."

DavidJ ::

http://www2.arnes.si/~tpotoc1/stuff/problem/index.htm

Da ne bo kakšnih dodatnih vprašanje, je naredil še tole.
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')

NoUse4AName ::

Glede hitrosti jezika sploh ni debate, da je C/C++ najhitrejsi. Tudi v .NET platformi, kjer bi naj bili vsi jeziki enakopravni (v bistvu so majhne razlike) je C++ edini tisti za katerega ima prevajalnik kompletno optimizacijo (pa da ne govorimo o mesanju managed in ne managed kode).

Senitel ::

davids: Kot smo v tem threadu ze ugotovili, sta bili C verziji programa 3 napake:
-printf na konzolo (popravljeno v verziji, ki je na oni strani)
-for zanka je hodila namesto do sqrt(prime) do prime-1 (tudi popravljeno v verziji, ki je na oni strani)
-timer, ki pa v novi verziji se ni popravljen!! Od kje za boga pride tole differ = (stopTime - startTime)18.217??? To bi moralo biti CLOCKS_PER_SEC, in CLOCKS_PER_SEC je vsaj v VC-ju 1000.

DavidJ ::

Sentinel in ostali, tule sem zgolj posrednik. Vaši odgovori pa so mu poslani nazaj. :)
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')

Rokec ::

Zakaj je pa Javin program tulk počasnejši?! Napisan je prov (mnde), skompajliran pa je v Borland JBuilder 6 in 9?!

DavidJ ::

Odgovor avtorja (ima težave z registracijo in mi je posredoval odgovor na mejl).

Vrednost 18.217 je zgolj priblizek dobljen z merjenjem.
t1 = clock();
sleep(x);
t2=clock();
time=t2-t1;

18.216666... = time /x // za velike x

Vse to je bilo potrebno, ker Turbo C ne prepozna CLOCKS_PER_SEC (mislim, da
je ni niti v time.h), zato jo je bilo treba izmeriti.
Dejstvo je, da je to priblizek in da izracunan cas ni natancen, vendar je v
okviru sprejemljivega & logicnega. Seveda pa se ni zgodilo, da bi program
izacunal (npr takoj) in vrnil, da je racunal 20s. : )

Kodo pa sem prevedel tudi v VC++6 in uporabil CLOCKS_PER_SEC! Stvar deluje,
vendar za izracun potrebuje 3-4s, kar je bistveno manj kot pri Turbo C(20s),
vendar vec od VB6(1,7s) !!! Zakaj?!?
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')

Zgodovina sprememb…

  • spremenil: DavidJ ()

Senitel ::

Okej sem celo poiskal ta Turbo C 2.01 in ugotovil, da je bila zadeva releasana 11 maja 1989 >:D. Torej iz casov 386... Od takrat se je v CPU-jih pojavilo precej novih stvari, ki jih ta compiler sploh ne pozna.

Kar se pa VC 6 tice: VC ima v osnovi dva nacina "debug build" in "release build". Za informacijo P3 450 na katerem sem trenutno poisce prvih 100000 prastevil s to aplikacijo v 17 sekundah za debug build in v 4 sekundah za release build.

Primoz ::

Zadeva v večini starejših prevajalnikov (ne Intel), dela precej hitreje, če se uporabi začasna spremenljivka.. torej:

a = sqrt(b)

for i = 3 to a (i+=2)

in ne

for i= 3 to a (i+=2)

ce je stevilo sodo.. pač preveriš na začetku :))
There can be no real freedom without the freedom to fail.

Rokec ::

A lahk kdo dokaže, da C najde prvih 100 praštevil prej, kot VB?!
Če je počasen compiler, a lahk kdo skompajlira to z boljšim compilerjem, pa da gor program?

Rokec ::

Dva posta višje je najbrž napaka

----------------------
a = sqrt(b)

for i = 3 to a (i+=2)

in ne

for i= 3 to sqrt(b) (i+=2)
------------------------------Je tako?

No, to ne naredi dost vlke razlike!

Zgodovina sprememb…

  • spremenil: Rokec ()

Primoz ::

Ja napaka je :))

In ja.. precej razlike naredi ;)) samo je treba delat z števili do 1mio ali kaj podobnega... ali pa maš kakšen pameten prevajalnik (od cja tole pravilno reši samo intelovo čudo).. (stanje ene 6 mesecev nazaj ... od takrat nisem gledal)
There can be no real freedom without the freedom to fail.

Primoz ::

Drugače... pa vsekakor je hitrejši "moj" prevajalnik... ki pogleda kaj ta stvar izpiše.. in shrani.. in potem samo to izpisuje pri izvajanju... :)) samo določene stvari so pač neprimerljive (recimo, ko tlačite javo v primerjavo)
There can be no real freedom without the freedom to fail.

Primoz ::

Prvih 250.000 praštevil v 1,1s... brute force :)) (c program, ki jih izračuna) :)
There can be no real freedom without the freedom to fail.

Zgodovina sprememb…

  • spremenil: Primoz ()

Rokec ::

Praviš 1,1s ... dokaz, pokazi kodo!

Primoz ::

long int stevilo = 1;
long int j;
long int root;
int zadetek;
while (howmuch) {
stevilo += 2;
root = sqrt(stevilo);
zadetek =1;
for (j=3; j < root; j+=2) {
if (stevilo % j == 0) {
zadetek = 0;
break;
};
};
if (zadetek) {
howmuch--:
};
}

po spominu.. copy/paste dobis zvecer :))
There can be no real freedom without the freedom to fail.

Primoz ::

A zelis ne bruteforce resitev..... oz. malo bolj inteligentno :)

:))
There can be no real freedom without the freedom to fail.

Zgodovina sprememb…

  • spremenil: Primoz ()

Rokec ::

Ja, želim!
Pa copy/paste bi tut mel, ker se mi zdi, da tole ni čist vredu?!

Pa kaj je z Javo? A lahk kdo napiše seznam, kak so bolj znani programski jeziki hitri (od najpočasnejšega, do najhitrejšega)? Ker jst sem skoz do zdej mislu, da je Java hitrejša od Basica, ampak poskus pokaže precej drugačne rešitve!

Zgodovina sprememb…

  • spremenil: Rokec ()

asPeteR ::

->Rokec

Ti pa programiranje trije pojmi kaj?;)

Ce vsaj malo ves, potem bi lahko vedel, da je Java eden pocasnejsih jezikov ... Saj tece na JVM, sth like emulacija.

Splosno je najhitrejsi jezik C.

Drugace pa je zelo tezko reci kater jezik je najhitrejsi, kajti vsak je hiter oz. najhitrejsi na svojem podrocju.
http://blog.stegnar.com

blabla ::

user4683 ::

rdtsc.cpp

Da bo merjenje časa bolj natančno :)

LP, snake

PS.: še dokument: rdtsc

[ EDIT ] Ups, en hrošč. Pojavi se v funkciji, ki izmeri frekvenco računala. QueryPerformanceCounter((union _LARGE_INTEGER*)&i1); premaknite nad prvi __asm blok (pod deklaracije spremeljivk).

Zgodovina sprememb…

  • spremenil: user4683 ()

Rokec ::

Od teorije res ne vem skor nič!
Vem sam, da je Basic enostaven, pa počasen, pa da je C najhitrejši, pa ne preveč enostaven.
Prakse mam pa ene 20 ur v Basicu, pa ene 5 ur v Javi.
Tak de ja, čist sem še zelen! Sam sem se hotu naučit mal programirat, sam je izbira precej vlka, tak de zdej ne vem, kaj nej! Kak je pa kej s hitrostjo VS.NET?

Zgodovina sprememb…

  • spremenil: Rokec ()

user4683 ::

VS.NET ni jezik, tako da s hitrostjo tega ne bom kaj veliko blebetal :) Razen morda to, da je compiler nekoliko izboljsan (hitreje prevaja, koncni produkt pa hitreje tece).
ce te pa zanima z .NET stvarmi je pa spertvec varijant (o njih ne bom veliko, ker nisem s tega podrocja)... npr. to, da se koda v strojni jezik se prevede ob zagonu aplikacije, kar zna biti nekoliko pocasneje.

NoUse4AName ::

to da se .net prevede ob zagonu aplikacije je povrsno povedano, ker se ne prevede celoten program. Prevaja se po delih, ko neko funkcijo prvic klices se bo prevedla v strojno kodo in potem od tam dalje vsakic, ko jo poklices bo ze prevedena.
Tudi jeziki v .NET niso vsi enako hitri, ker nimajo enako dobro razvite prevajalnike (c++ ima najboljsega), ampak razlike niso tako velike koliko vem.

pivmik ::

Kaj pa ASM, a ni Assembly language najhitrejši?
Ker dela direktno s funkcijami procesorja.
LP, Gregor GRE^

OwcA ::

Kaj pa ASM, a ni Assembly language najhitrejši?
Ker dela direktno s funkcijami procesorja.

Teoretično res. Praktično pa jih je malo junakov, ki bi lahko spisali bolj optimizirano kodo kot to stori dober prevajalnik. Tisti, ki to znajo pa pišejo te prevajalnike. ;)
Otroška radovednost - gonilo napredka.

BigWhale ::

Owca, odvisno kaj pocnes, ce dostopas direktno do HW je v veliko primerih ASM se vedno najhitrejsi. Prevajalnik kakrsenkoli ze je, ti bo dostop do HWja tezko tezko optimiziral.

Kar se pa algoritmov tice, se pa strinjam.

OwcA ::

Owca, odvisno kaj pocnes, ce dostopas direktno do HW je v veliko primerih ASM se vedno najhitrejsi.

Se strinjam, samo po drug strani je kar nekaj teh funkcij pravzaprav samo v funkcijo oblečena ASM koda (naprimer inp() in outp()). Za kakšne naprednejše zadevščine (DMA, sidebanding ...) pa moraš še vedno poznati goro specifikacij.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

darkolord ::

em povsod lahko nardis hiter algoritem... sam znat je treba :D

aja pa tut tist k je v VBju testiran se vedno ni najhitrejs kukr se da...

aja pa se to... pri sodobnih programih ima hitrost vedno manjsi pomen... pomembna je ucinkovitost... ce hoces speed programiraj v ASM...

Zgodovina sprememb…

  • spremenilo: darkolord ()

BigWhale ::

> ucinkovitost... ce hoces speed programiraj v ASM...

Glih prej smo ugotovili, da so compilerji ze tolk dobri, da sam tezko sproduciras hitrejso ASM kodo ;)
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Digitalna evolucija (strani: 1 2 3 426 27 28 29 )

Oddelek: Znanost in tehnologija
141673213 (23382) pietro
»

Funkcija z logičnimi operaterji.... (strani: 1 2 )

Oddelek: Programiranje
905095 (4441) CaqKa
»

Generatorji praštevil

Oddelek: Znanost in tehnologija
473684 (2588) Phil
»

Petaflopsu naproti (strani: 1 2 3 )

Oddelek: Novice / Procesorji
1058146 (8146) Marjan
»

kako definirtati prastevilo

Oddelek: Programiranje
143674 (3479) ooux

Več podobnih tem