Tulokset:
REBOL 6 minuuttia 29.452 sekuntia Javascript 0.264 sekuntia Chrome selain free pascal 2 min 17.314 sekuntia RED 6.337 sekuntia Freebasic 0.00001157 sekuntia ??!! (missä bugi? Ohjelma tulosti nopeasti: 1.157407677965239e-005) Python 24 sekuntia php 5.509 sekuntia
REBOL:
rebol[] print "Odota" t1: now/precise for i 1 1000000 1 [ ;1000000 * 1000 = miljardi, lasketaan siis miljardiin for j 1 1000 1 [ ] ] t2: now/precise print difference t2 t1 halt
JAVASCRIPT:
<HTML> <BODY onload="Time()"> <script> function Time() { var d1 = new Date(); var d2 = new Date(); let time1 = d1.getTime(); for (let i=1; i<=1000000; i++) { for (let j=1; j<=1000; j++) { } } let time2 = d2.getTime(); document.getElementById("tulostus1").innerHTML =time1; document.getElementById("tulostus2").innerHTML =time2; } </script> <p id="tulostus1"></p> <p id="tulostus2"></p> </body> </HTML>
FREEPASCAL:
program nopeustesti; uses crt, sysutils; VAR i,j: LongInt; aika1, aika2, ero: Double; BEGIN aika1:=Now; FOR i:=1 TO 1000000 DO FOR j:=1 TO 1000 DO aika2:=Now; ero:=(aika2-aika1) * 86400; WRITELN(ero); END.
RED:
red[] print "Odota" t1: now/precise loop 1000000 [ loop 1000 [ ] ] t2: now/precise print difference t2 t1 halt
FREEBASIC:
#include "vbcompat.bi" Dim time1 As Double, time2 As Double time1=Now For i As Integer = 1 To 1000000 Step 1 For j As Integer = 1 To 1000 Step 1 Next j Next i time2=Now Print time2-time1
PYTHON:
import time i=0 time1=time.localtime() for x in range(0, 1000000, 1): for y in range(0, 1000, 1): pass time2=time.localtime() print(time1) print(time2)
PHP:
Äärettömän huono testi ja hyvin epäreilu käännettyjen kielien eduksi. Useimmat kääntäjät nykypäivänä optimoivat nuo turhat silmukat pois joissa ei tehdä mitään ja tulosta ei käytetä mihinkään.
Minusta ohjelmoinnilla leikkiminen ei koskaan ole äärettömän huonoa huvia :) Testi voi olla olla, niinkuin sanoitkin. Oisko sulla parannusehdotusta siihen, kuinka testin tapainen kannattaisi suorittaa? Piitä ei nyt huvittaisi alkaa laskemaan. Lisäisinkö silmukkaan vaan joitain laskutoimituksia? Paranesiko se sillä?
jalski kirjoitti:
Äärettömän huono testi ja hyvin epäreilu käännettyjen kielien eduksi. Useimmat kääntäjät nykypäivänä optimoivat nuo turhat silmukat pois joissa ei tehdä mitään ja tulosta ei käytetä mihinkään.
No lasketaanpa huvin vuoksi sarjan 1/1+1/2+1/3+...+1/satamiljoonaa summaa:
En tiedä mitä Red kieli (tai minä?) sekoilee, kun se saa sarjan summaksi ykkösen!
REBOL 1 minuutti 17.638 sekuntia summa=1020.53987036029 Javascript ? sekuntia (nopeasti)summa=1020.5398703602922 Free Pascal 2.189 sekuntia summa=1020.5398703598049 Red 28.679 sekuntia summa=1 FreeBasic 0.000011574 sekuntia summa=1020.539870359805 Python 18 sekuntia summa=1011.3243231647201 php 7 sekuntia summa=1020.5398703603
REBOL:
rebol[] print "Odota" summa: 0 t1: now/precise for i 1 1000000 1 [ ;1000000 * 100 = lasketaan siis 100 miljoonaan for j 1 100 1 [ jakaja: i + j - 1 summa: summa + (1 / jakaja) ] ] t2: now/precise print difference t2 t1 print summa halt
JAVASCRIPT:
<HTML> <BODY onload="Time()"> <script> function Time() { var d1 = new Date(); var d2 = new Date(); var summa; summa=0; var jakaja; let time1 = d1.getTime(); for (let i=1; i<=1000000; i++) { for (let j=1; j<=100; j++) { jakaja=i+j-1; summa=summa+(1/jakaja); } } let time2 = d2.getTime(); document.getElementById("tulostus1").innerHTML =time1; document.getElementById("tulostus2").innerHTML =time2; document.getElementById("summa").innerHTML =summa; } </script> <p id="tulostus1"></p> <p id="tulostus2"></p> <p id="summa"></p> </body> </HTML>
FREE PASCAL:
program nopeustesti; uses crt, sysutils; VAR i,j: LongInt; aika1, aika2, ero, summa, jakaja: Double; BEGIN aika1:=Now; FOR i:=1 TO 1000000 DO FOR j:=1 TO 100 DO BEGIN jakaja:=i+j-1; summa:=summa+(1/jakaja); END; aika2:=Now; ero:=(aika2-aika1) * 86400; WRITELN(ero); WRITELN(summa); END.
RED:
red[] print "Odota" summa: 0.0 jakaja: 1 t1: now/precise loop 1000000 [ loop 100 [ summa: summa + (1 / jakaja) jakaja: jakaja + 1 ] ] t2: now/precise print difference t2 t1 print summa halt
FREEBASIC:
#include "vbcompat.bi" Dim time1 As Double, time2 As Double, summa As Double Dim jakaja As Integer summa=0 time1=Now For i As Integer = 1 To 1000000 Step 1 For j As Integer = 1 To 100 Step 1 jakaja=i+j-1 summa=summa+(1/jakaja) Next j Next i time2=Now Print time2-time1 Print summa
PYTHON:
import time summa=0 time1=time.localtime() for x in range(1, 1000000, 1): for y in range(1, 100, 1): jakaja=x+y-1; summa=summa+(1/jakaja); time2=time.localtime() print(time1) print(time2) print(summa)
PHP:
jalskin mainitsemien periaatteellisten ongelmien lisäksi koodissasi on kriittisiä virheitä:
JS-koodissa luot molemmat aikaleimat peräkkäin ennen testattavaa koodia, joten se ei mittaa suoritusta lainkaan. Lisäksi JS:n getTime-funktion yksikkö on millisekunti.
FreeBasicin Now palauttaa ajan päivinä eikä sekunteina, eli tämä pitäisi kertoa 86400:lla.
Pythonin silmukan rajat ovat väärin, kuten poikkeavasta summasta näkyy: range päättyy ennen annettua lopetusrajaa.
Olisiko REDissä ehkä jakolasku kokonaisluvuilla, jolloin 1/x on 0 aina, kun x on suurempi kuin 1. Muutenkin siinä koodissa on ihan eri jakaja kuin muissa, mieti nyt vielä tuota muiden kielten kaavaa i+j-1, että mitähän lukuja se tuottaa eri kierroksilla: ei ainakaan sataamiljoonaa eri lukua.
Ilmeisesti kielissä on jotain eroa siinä, miten kokonaislukujen jakolasku muuttuu liukuluvuksi, kun tulos on vähän eri.
Vertailussa tulisi vähintäänkin kertoa käytetty kääntäjä ja sen asetukset eri kielille. Optimointi tulisi yleensä olla käytössä ja debug-ominaisuudet poissa, kun nopeutta testataan.
No huh! Olipas mulla virheitä. En viitti koodeja enää laittaa näkyville, mutta korjausten jälkeen sain:
REBOL 1 min 10.033 sek summa=18.9978964138526 JAVASCRIPT: 0.146 sek summa=18.997896413852555 Chromme selain JAVASCRIPT: 0.137 sek summa=18.997896413852555 FireFox selain FREEPASCAL: 0.245 sek summa=18.997896413847702 Free Pascal Compiler version 3.2.0 [2020/06/04] for i386 RED 35.571 sek summa=18.9978964138477 Red Compiler 0.6.4 FREEBASIC 0 summa=18.9978964138477 fbc32 FREEBASIC 0 summa=18.99789641385256 fbc64 PYTHON 13 sek summa=18.987845078049098 Python39 PHP 6 sek summa=18.997896413853 PHP 7.3
Juu, ei tää ny niin vakavaa oo!
Aihe on jo aika vanha, joten et voi enää vastata siihen.