8000 Test 4.5/2: finished · JayAyAre/PyScript-vs-JavaScript@81c01c2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 81c01c2

Browse files
committed
Test 4.5/2: finished
1 parent 59ec81e commit 81c01c2

File tree

5 files changed

+196
-154
lines changed

5 files changed

+196
-154
lines changed

4.5-criptografia/prueba-2/index.html

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,19 @@ <h1>Benchmark: cryptographic proofs</h1>
8282
<h2 id="output"></h2>
8383

8484
<div>
85-
<div>
86-
<label>Número de repeticiones:</label>
87-
<input type="number" id="num-repetitions-js" value="5" min="1">
88-
</div>
89-
<div>
90-
57A7 <label>Tamaño del archivo (MB):</label>
91-
<input type="number" id="file-size-js" value="1" min="0.1" step="0.1">
92-
</div>
85+
<label>Repetitions:</label>
86+
<input type="number" id="num-repetitions-js" value="5" min="1">
87+
<label>Message size (MB):</label>
88+
<input type="number" id="message-size-js" value="1" min="0.1" step="0.1">
9389
<button id="run-button-js" onclick="javascriptBenchmark()">Run JavaScript</button>
9490
</div>
9591

9692

9793
<div>
98-
<div>
99-
<label>Número de repeticiones:</label>
100-
<input type="number" id="num-repetitions-py" value="5" min="1">
101-
</div>
102-
<div>
103-
<label>Tamaño del archivo (MB):</label>
104-
<input type="number" id="file-size-py" value="1" min="0.1" step="0.1">
105-
</div>
94+
<label>Repetitions:</label>
95+
<input type="number" id="num-repetitions-py" value="5" min="1">
96+
<label>Message size (MB):</label>
97+
<input type="number" id="message-size-py" value="1" min="0.1" step="0.1">
10698
<button id="run-button-py" py-click="launch_worker" disabled>Run PyScript (Loading...)</button>
10799
</div>
108100

4.5-criptografia/prueba-2/javascript/main.js

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ function stopJsTimer() {
2828
async function javascriptBenchmark() {
2929
try {
3030
startJsTimer();
31+
32+
// measure Worker init time
3133
const startWorkerTime = performance.now();
3234
if (!worker) {
3335
worker = new Worker("./javascript/worker.js");
@@ -36,26 +38,25 @@ async function javascriptBenchmark() {
3638

3739
clearCell("javascript");
3840

41+
// read inputs
3942
const repetitions = parseInt(
4043
document.getElementById("num-repetitions-js").value,
4144
10
4245
);
43-
const fileSizeMb = parseFloat(
44-
document.getElementById("file-size-js").value
46+
const messageSizeMb = parseFloat(
47+
document.getElementById("message-size-js").value
4548
);
4649
const id = `js-${Date.now()}`;
4750

51+
// dispatch to worker
4852
const resultJson = await new Promise((resolve, reject) => {
49-
// handler que sólo procesa nuestro mensaje
5053
function onMessage(e) {
5154
if (e.data.id !== id) return;
5255
worker.removeEventListener("message", onMessage);
5356
if (e.data.error) {
5457
reject(new Error(e.data.error));
55-
} else if (e.data.json !== undefined) {
56-
resolve(e.data.json);
5758
} else {
58-
reject(new Error("Worker dont return results"));
59+
resolve(e.data.json);
5960
}
6061
}
6162
worker.addEventListener("message", onMessage);
@@ -64,16 +65,17 @@ async function javascriptBenchmark() {
6465
type: "js_run_js_benchmark",
6566
workerTime,
6667
repetitions,
67-
fileSizeMb,
68+
messageSizeMb,
6869
});
6970
});
7071

7172
const result = JSON.parse(resultJson);
7273
displayResult(result, workerTime);
7374
} catch (err) {
7475
console.error("Benchmark error:", err);
75-
const out = document.getElementById("javascript-output");
76-
out.textContent = `Error: ${err.message}`;
76+
document.getElementById(
77+
"javascript-output"
78+
).textContent = `Error: ${err.message}`;
7779
} finally {
7880
stopJsTimer();
7981
}
@@ -86,23 +88,29 @@ function clearCell(prefix) {
8688
});
8789
}
8890

89-
function displayResult(result, workerTime) {
91+
function displayResult(r, workerTime) {
9092
const out = document.getElementById("javascript-output");
9193
const exact = document.getElementById("javascript-exact");
9294

9395
out.innerHTML = `
94-
<div>Worker time: ${workerTime.toFixed(2)} ms</div>
95-
<div>Simulated file: ${result.file_size_mb.toFixed(2)} MB</div>
96-
<div>Repetitions: ${result.repetitions}</div>
97-
<div>Avg hash time: ${result.hash_avg_time_ms.toFixed(2)} ms</div>
98-
<div>Avg verify time: ${result.verify_avg_time_ms.toFixed(2)} ms</div>
99-
<div>Last hash (shortened): ${result.last_digest.slice(0, 20)}...</div>
96+
<div>Worker init time: ${workerTime.toFixed(2)} ms</div>
97+
<div>Message size: ${r.message_size_mb.toFixed(2)} MB</div>
98+
<div>Repetitions: ${r.repetitions}</div>
99+
<div>Avg encrypt time: ${r.encrypt_avg_ms.toFixed(2)} ms</div>
100+
<div>Avg decrypt time: ${r.decrypt_avg_ms.toFixed(2)} ms</div>
101+
<div>Integrity check: ${r.integrity_ok ? "OK" : "FAIL"}</div>
102+
<div>Integrity success: ${r.success_count} of ${
103+
r.repetitions
104+
} (${r.success_percentage.toFixed(2)}%)</div>
105+
<div>Ciphertext size: ${(r.ciphertext_bytes / 1024 / 1024).toFixed(
106+
2
107+
)} MB</div>
100108
`;
101109
exact.innerHTML = `
102-
<div>Total op time: ${result.total_time_ms.toFixed(2)} ms</div>
103-
<div>Total time: ${result.total_time.toFixed(2)} ms</div>
110+
<div>Total crypto time: ${r.crypto_total_ms.toFixed(2)} ms</div>
111+
<div>Overall total time: ${r.overall_time_ms.toFixed(2)} ms</div>
104112
`;
105113
}
106114

107-
// dejar expuesta
115+
// expose globally
108116
window.javascriptBenchmark = javascriptBenchmark;
Lines changed: 78 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,98 @@
1+
// worker.js
12
self.addEventListener("message", async (event) => {
23
const data = event.data;
4+
if (data.type !== "js_run_js_benchmark") return;
35

4-
if (data.type === "js_run_js_benchmark") {
5-
try {
6-
const { id, repetitions, fileSizeMb, workerTime } = data;
6+
const { id, repetitions, messageSizeMb } = data;
7+
try {
8+
// small delay to mimic async setup
9+
await new Promise((r) => setTimeout(r, 100));
710

8-
await new Promise((r) => setTimeout(r, 100));
11+
const fileSizeBytes = Math.floor(messageSizeMb * 1024 * 1024);
12+
const buffer = getRandomBuffer(fileSizeBytes);
913

10-
const fileSizeBytes = Math.floor(fileSizeMb * 1024 * 1024);
11-
const buffer = getRandomBuffer(fileSizeBytes);
14+
let totalEnc = 0,
15+
totalDec = 0,
16+
successCount = 0;
17+
let ciphertext = null;
1218

13-
let totalHashTime = 0;
14-
let totalVerifyTime = 0;
15-
let lastDigest = "";
19+
const t0 = performance.now();
1620

17-
const encoder = new TextEncoder();
21+
for (let i = 0; i < repetitions; i++) {
22+
// generate AES-GCM key
23+
const key = await crypto.subtle.generateKey(
24+
{ name: "AES-GCM", length: 128 },
25+
true,
26+
["encrypt", "decrypt"]
27+
);
28+
const iv = crypto.getRandomValues(new Uint8Array(12));
1829

19-
const startBenchmark = performance.now();
30+
// encrypt
31+
const encStart = performance.now();
32+
const ctBuf = await crypto.subtle.encrypt(
33+
{ name: "AES-GCM", iv: iv },
34+
key,
35+
buffer
36+
);
37+
totalEnc += performance.now() - encStart;
38+
ciphertext = ctBuf;
2039

21-
for (let i = 0; i < repetitions; i++) {
22-
const hashStart = performance.now();
23-
const hashBuffer = await crypto.subtle.digest(
24-
"SHA-256",
25-
buffer
40+
// decrypt + verify
41+
const decStart = performance.now();
42+
try {
43+
const ptBuf = await crypto.subtle.decrypt(
44+
{ name: "AES-GCM", iv: iv },
45+
key,
46+
ctBuf
2647
);
27-
totalHashTime += performance.now() - hashStart;
28-
29-
const verifyStart = performance.now();
30-
const verifyBuffer = await crypto.subtle.digest(
31-
"SHA-256",
32-
buffer
33-
);
34-
totalVerifyTime += performance.now() - verifyStart;
35-
36-
lastDigest = [...new Uint8Array(hashBuffer)]
37-
.map((b) => b.toString(16).padStart(2, "0"))
38-
.join("");
48+
if (buffersEqual(ptBuf, buffer)) {
49+
successCount++;
50+
}
51+
} catch (_) {
52+
// fail silently
3953
}
54+
totalDec += performance.now() - decStart;
55+
}
4056

41-
const totalTime = performance.now() - startBenchmark;
57+
const overall = performance.now() - t0;
4258

43-
const result = {
44-
repetitions,
45-
file_size_mb: fileSizeMb,
46-
hash_avg_time_ms: totalHashTime / repetitions,
47-
verify_avg_time_ms: totalVerifyTime / repetitions,
48-
total_time_ms: totalHashTime + totalVerifyTime,
49-
last_digest: lastDigest,
50-
total_time: totalTime,
51-
};
59+
const result = {
60+
repetitions,
61+
message_size_mb: messageSizeMb,
62+
encrypt_avg_ms: totalEnc / repetitions,
63+
decrypt_avg_ms: totalDec / repetitions,
64+
crypto_total_ms: totalEnc + totalDec,
65+
overall_time_ms: overall,
66+
integrity_ok: successCount === repetitions,
67+
success_count: successCount,
68+
success_percentage: (successCount / repetitions) * 100,
69+
ciphertext_bytes: ciphertext.byteLength,
70+
};
5271

53-
self.postMessage({ id, json: JSON.stringify(result) });
54-
} catch (error) {
55-
self.postMessage({
56-
id: data.id,
57-
error: `Error in worker: ${error.message}`,
58-
});
59-
}
72+
self.postMessage({ id, json: JSON.stringify(result) });
73+
} catch (err) {
74+
self.postMessage({ id, error: `Error in worker: ${err.message}` });
6075
}
6176
});
6277

78+
// Helper: fill a large Uint8Array with random values in 64k chunks
6379
function getRandomBuffer(size) {
64-
const buffer = new Uint8Array(size);
65-
const chunkSize = 65536;
66-
for (let offset = 0; offset < size; offset += chunkSize) {
67-
const chunk = Math.min(chunkSize, size - offset);
68-
crypto.getRandomValues(buffer.subarray(offset, offset + chunk));
80+
const buf = new Uint8Array(size);
81+
const chunk = 65536;
82+
for (let offset = 0; offset < size; offset += chunk) {
83+
const end = Math.min(offset + chunk, size);
84+
crypto.getRandomValues(buf.subarray(offset, end));
85+
}
86+
return buf.buffer;
87+
}
88+
89+
// Helper: compare two ArrayBuffers
90+
function buffersEqual(a, b) {
91+
if (a.byteLength !== b.byteLength) return false;
92+
const v1 = new Uint8Array(a);
93+
const v2 = new Uint8Array(b);
94+
for (let i = 0; i < v1.length; i++) {
95+
if (v1[i] !== v2[i]) return false;
6996
}
70-
return buffer;
97+
return true;
7198
}
Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import time
2-
from pyscript import PyWorker, display
3-
import js # type: ignore
42
import json
3+
import asyncio
4+
from pyscript import PyWorker, display, document
5+
import js # type: ignore
56

67
worker = None
78

@@ -10,36 +11,44 @@ async def launch_worker(event):
1011
global worker
1112
js.clearCell("pyscript")
1213
js.startPyTimer()
13-
start_worker_time = time.perf_counter()
14+
start_w = time.perf_counter()
1415

1516
if worker is None:
16-
worker = PyWorker("./python/worker.py", type="pyodide",
17-
config="./json/pyscript-worker.json")
17+
worker = PyWorker(
18+
"./python/worker.py",
19+
type="pyodide",
20+
config="./json/pyscript-worker.json"
21+
)
1822
await worker.ready
1923

20-
worker_time = (time.perf_counter() - start_worker_time) * 1000
21-
json_str = await worker.sync.js_run_py_benchmark(worker_time)
22-
result = json.loads(json_str)
24+
worker_time = (time.perf_counter() - start_w) * 1000
25+
# Llamada al worker; devuelve JSON serializado
26+
result_json = await worker.sync.js_run_py_benchmark(worker_time)
27+
result = json.loads(result_json)
2328

2429
display_result(result, worker_time)
2530
js.stopPyTimer()
2631

2732

28-
def display_result(result, worker_time):
33+
def display_result(r, worker_time):
34+
display(f"Worker init time: {worker_time:.2f} ms",
35+
target="pyscript-output")
2936
display(
30-
f"Worker time: {worker_time:.2f} ms", target="pyscript-output")
37+
f"Message size: {r['message_size_mb']:.2f} MB", target="pyscript-output")
38+
display(f"Repetitions: {r['repetitions']}", target="pyscript-output")
3139
display(
32-
f"Simulated file: {result['file_size_mb']:.2f} MB", target="pyscript-output")
40+
f"Avg encrypt time: {r['encrypt_avg_ms']:.2f} ms", target="pyscript-output")
3341
display(
34-
f"Repetitions: {result['repetitions']}", target="pyscript-output")
35-
display(f"Avg hash time: {result['hash_avg_time_ms']:.2f} ms",
36-
target="pyscript-output")
37-
display(f"Avg verify time: {result['verify_avg_time_ms']:.2f} ms",
38-
target="pyscript-output")
42+
f"Avg decrypt time: {r['decrypt_avg_ms']:.2f} ms", target="pyscript-output")
43+
display(
44+
f"Integrity check: {'OK' if r['integrity_ok'] else 'FAIL'}", target="pyscript-output")
3945
display(
40-
f"Last hash (shortened): {result['last_digest'][:20]}...", target="pyscript-output")
46+
f"Integrity success: {r['success_count']} of {r['repetitions']} "
47+
f"({r['success_percentage']:.2f}%)", target="pyscript-output")
48+
display(
49+
f"Ciphertext size: {(r['ciphertext_bytes']/1024**2):.2f} MB", target="pyscript-output")
4150

42-
display(f"Total op time: {result['total_time_ms']:.2f} ms",
43-
target="pyscript-exact")
4451
display(
45-
f"Total time: {result['total_time']:.2f} ms", target="pyscript-exact")
52+
f"Total crypto time: {r['crypto_total_ms']:.2f} ms", target="pyscript-exact")
53+
display(
54+
f"Overall total time: {r['overall_time_ms']:.2f} ms", target="pyscript-exact")

0 commit comments

Comments
 (0)
0