Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: JavaScript, PHP: Latausnopeusmittari

Metabolix [11.11.2021 23:50:17]

#

Puuttui taas sopiva työkalu, niin piti tehdä itse.

Tämä nettisivu mittaa latausnopeutta. JavaScriptilla tehdään sivulle POST-pyyntö, jolla ladataan PHP-skriptiltä giga dataa. Tuloksia näytetään juoksevasti latauksen aikana.

Koodissa käytetään nykyaikaisia JavaScriptin ominaisuuksia: Fetch API, Response, ReadableStream, asynkroniset funktiot (async/await), tekstitemplaatti (template string).

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
	// POST-pyyntöön vastauksena tuotetaan 1000 megatavua dataa.
	// Data tehdään xorraamalla kahta satunnaisdatalohkoa.
	// Tuloksena on riittävän satunnaista dataa, ettei se pakkaudu.
	// Generointi on nopeampaa kuin aina uuden satunnaisdatan tekeminen.
	// (Optimointi näkyy lähinnä koneen sisäisessä testissä...)
	$max = (1 << 20) * 1000;
	header("Content-Type: application/octet-stream");
	header("Content-Length: $max");
	$a = random_bytes(1 << 16);
	$b = random_bytes(1 << 16);
	for ($l = 0; $l < $max; $l += strlen($a)) {
		$a = substr($a, 8) . substr($a, 0, 8);
		echo $a ^ $b;
	}
	exit;
}
?>
<!DOCTYPE html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nopeustesti</title>
<style>
body {
	font-family: monospace;
	white-space: pre;
}
</style>
<body>
<script>
(async function() {
	// Kiva pyöristys
	function roundNice(x) {
		const y = x < 99.5 ? x < 9.95 ? 100 : 10 : 1;
		return (Math.round(x * y) / y).toLocaleString();
	}
	// n = datan määrä, t = aika, ja +110 tuo ajan desimaalit kivasti esiin.
	let n = 0, n1 = 0, t0 = performance.now(), t1 = t0 + 110;
	function show(end) {
		// Päivitetään ruutu enintään 4 kertaa sekunnissa ja lopussa.
		const t = performance.now();
		if (!end && t < t1 + 1000 / 4) return;

		// Lasketaan megatavut ja sekunnit.
		const MB0 = n / (1<<20);
		const MB1 = (n - n1) / (1<<20);
		const s0 = (t - t0) / 1000;
		const s1 = (t - t1) / 1000;
		n1 = n;
		t1 = t;

		// Näyttö.
		document.body.textContent = `
+-------------------------------+
|				|
|	total	${roundNice(MB0)}	MB	|
|	total	${roundNice(s0)}	s	|
|	avg	${roundNice(MB0 / s0)}	MB/s	|
|	now	${roundNice(MB1 / s1)}	MB/s	|
|				|
+-------------------------------+
		`;
	}

	// Haetaan tämä sivu POSTilla, siitä tulee mitattava data.
	const response = await fetch("", {method: "POST"});
	const reader = response.body.getReader();
	while (true) {
		const { value, done } = await reader.read();
		if (done) break;
		n += value.length;
		show();
	}
	show(true);
})();
</script>

P.S. Saatan obfuskoida koodin myöhemmin, koska muuten joku ehkä varastaa sen.

carabia [12.11.2021 00:12:47]

#

lollotilollotilolloo,
ehdinpäs jo varastaa sen.
aion itse käyttää .net ja nodejs ja restful ja mikropalvelut ja sitten se onkin jo obfuskoitu niin päin vittua, ettei sitä enää kukaa varasta. suunnittelen pörssilistautumista ja myyn koodisi än äf teenä ja saan viisi sataa bitticoliccoa.

Grez [12.11.2021 09:10:13]

#

Onks tää nyt sit varastettu speedtest.netistä vai fast.comista :D

Metabolix [12.11.2021 17:55:04]

#

Syy oman purkkakoodin tekoon oli se, että testin kohteena oli kotiverkko (ja mm. Raspberry Pi ja kännykkä) eikä nettiyhteys. Tietysti tähän vaikuttivat myös yleinen masokismi ja tarve kokeilla uutta huipputeknologiaa (ReadableStream).

carabia kirjoitti:

ehdinpäs jo varastaa sen.

:( ilmoitan caribian netti miliisille.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta