added performance comparison

This commit is contained in:
Vanilla 2025-01-29 18:51:52 +03:00
parent 79b304eb5e
commit 9190277989

163
lab2/comparison.js Normal file
View File

@ -0,0 +1,163 @@
import { BigInteger } from "./index.js";
/**
* @param { number } length
*/
function RNG(length) {
let result = "";
for (let i = 0; i < length; i++) {
result += Math.trunc((Math.random() * 10)).toString();
}
return result.toLowerCase();
}
/**
* @param { BigInteger[] } vec1
* @param { BigInteger[] } vec2
*/
function vecAdd(vec1, vec2) {
const length = Math.min(vec1.length, vec2.length);
/**@type { BigInteger[] } */
const out = [];
for (let i = 0; i < length; i++) {
out.push(vec1[i].copy().add(vec2[i]));
}
return out;
}
/**
* @param { bigint[] } vec1
* @param { bigint[] } vec2
*/
function vecAddNative(vec1, vec2) {
const length = Math.min(vec1.length, vec2.length);
/**@type { bigint[] } */
const out = [];
for (let i = 0; i < length; i++) {
out.push(vec1[i] + vec2[i]);
}
return out;
}
/**
* @param { BigInteger[] } vec1
* @param { BigInteger[] } vec2
*/
function dot(vec1, vec2) {
const length = Math.min(vec1.length, vec2.length);
const out = BigInteger.from("0");
for (let i = 0; i < length; i++) {
out.add(vec1[i].copy().mul(vec2[i]));
}
return out;
}
/**
* @param { bigint[] } vec1
* @param { bigint[] } vec2
*/
function dotNative(vec1, vec2) {
const length = Math.min(vec1.length, vec2.length);
let out = 0n;
for (let i = 0; i < length; i++) {
out += vec1[i] * vec2[i];
}
return out;
}
/**
* @param { BigInteger[] } mx1 [m * n]
* @param { BigInteger[] } mx2 [n * k]
* @param { number } m
* @param { number } n
* @param { number } k
* @returns { BigInteger[] } [m * k]
*/
function matmul(mx1, mx2, m, n, k) {
const TMP = BigInteger.from("0");
/**@type { BigInteger[] } */
const out = []
for (let i0 = 0; i0 < m; i0++) {
for (let i3 = 0; i3 < k; i3++) {
let element = BigInteger.from("0");
for (let i2 = 0; i2 < n; i2++) {
element.add(TMP.assign(mx1[i0 * n + i2]).mul(mx2[i2 * k + i3]));
}
out.push(element);
}
}
return out;
}
/**
* @param { bigint[] } mx1 [m * n]
* @param { bigint[] } mx2 [n * k]
* @param { number } m
* @param { number } n
* @param { number } k
* @returns { bigint[] } [m * k]
*/
function matmulNative(mx1, mx2, m, n, k) {
/**@type { bigint[] } */
const out = []
for (let i0 = 0; i0 < m; i0++) {
for (let i3 = 0; i3 < k; i3++) {
let element = 0n;
for (let i2 = 0; i2 < n; i2++) {
element += mx1[i0 * n + i2] * mx2[i2 * k + i3];
}
out.push(element);
}
}
return out;
}
// const r = matmulNative([2n, -3n, 1n, 5n, 4n, -2n], [-7n, 5n, 2n, -1n, 4n, 3n], 2, 3, 2);
// const r = matmul([BigInteger.from("2"), BigInteger.from("-3"), BigInteger.from("1"), BigInteger.from("5"), BigInteger.from("4"), BigInteger.from("-2")], [BigInteger.from("-7"), BigInteger.from("5"), BigInteger.from("2"), BigInteger.from("-1"), BigInteger.from("4"), BigInteger.from("3")], 2, 3, 2)
function test() {
// console.time("tests");
/**@type { { n: number, name: string, time: number}[]} */
const results = [];
for (let i = 100; i <= 2000; i+= 100) {
const vec1Str = [];
const vec2Str = [];
for (let j = 0; j < 6; j++) {
vec1Str.push(RNG(i));
vec2Str.push(RNG(i));
}
const vec1 = vec1Str.map(str => BigInteger.from(str));
const vec2 = vec2Str.map(str => BigInteger.from(str));
const vec1n = vec1Str.map(str => BigInt(str));
const vec2n = vec2Str.map(str => BigInt(str));
let now = performance.now();
vecAdd(vec1, vec2);
results.push({ n: i, name: "vecAdd", time: performance.now() - now});
now = performance.now();
vecAddNative(vec1n, vec2n);
results.push({ n: i, name: "vecAddNative", time: performance.now() - now});
now = performance.now();
dot(vec1, vec2);
results.push({ n: i, name: "dot", time: performance.now() - now});
now = performance.now();
dotNative(vec1n, vec2n);
results.push({ n: i, name: "dotNative", time: performance.now() - now});
now = performance.now();
matmul(vec1, vec2, 2, 3, 2);
results.push({ n: i, name: "matmul", time: performance.now() - now});
now = performance.now();
matmulNative(vec1n, vec2n, 2, 3, 2);
results.push({ n: i, name: "matmulNative", time: performance.now() - now});
}
console.table(results);
}
test();