added performance comparison
This commit is contained in:
		
							parent
							
								
									79b304eb5e
								
							
						
					
					
						commit
						9190277989
					
				
							
								
								
									
										163
									
								
								lab2/comparison.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								lab2/comparison.js
									
									
									
									
									
										Normal 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();
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user