Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Lasketaanpas miljardiin seitsemällä eri kielellä

PetriKeckman [27.05.2023 13:05:38]

#

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:

<?php
$aika1=date("s");
for ($i=1; $i<=1000000; $i++) {
	for ($j=1; $j<=1000; $j++) {
	}
}
$aika2=date("s");
echo $aika1;
echo $aika2;
?>

jalski [27.05.2023 18:25:21]

#

Ää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.

PetriKeckman [27.05.2023 18:52:11]

#

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ä?

PetriKeckman [27.05.2023 20:54:21]

#

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:

<?php
$summa=0;
$aika1=date("s");
for ($i=1; $i<=1000000; $i++) {
	for ($j=1; $j<=100; $j++) {
		$jakaja=$i+$j-1;
		$summa=$summa+1/$jakaja;
	}
}
$aika2=date("s");
echo "$aika1 <br>";
echo "$aika2 <br>";
echo "$summa <br>";
?>

Metabolix [28.05.2023 01:30:50]

#

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.

PetriKeckman [28.05.2023 05:55:16]

#

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!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta