Skip to content

Instantly share code, notes, and snippets.

@wperron
Last active June 22, 2021 12:14
Show Gist options
  • Save wperron/d64dae5f89b344c2c63995de1faaeeb0 to your computer and use it in GitHub Desktop.
Save wperron/d64dae5f89b344c2c63995de1faaeeb0 to your computer and use it in GitHub Desktop.
Sum of all integers up to N

Summing up all numbers up to n

This is a comparison of two functions that sum up all the integer numbers from 1 to n and returns that sum.

Benchmarks

$ deno test --allow-read add.ts
Check file:///home/wperron/github.com/wperron/gists/add/add.ts
running 4 benchmarks ...
benchmark add ... 
    1001 runs avg: 31.842157842157842ms
benchmark recursive ... 
    1002 runs avg: 306.2614770459082ms
benchmark reduce ... 
    1003 runs avg: 309.7308075772682ms
benchmark wasm ... 
    1004 runs avg: 0.49203187250996017ms
import { assertEquals } from "https://deno.land/std@0.98.0/testing/asserts.ts";
import { bench, runBenchmarks } from "https://deno.land/std@0.98.0/testing/bench.ts";
import { add as wasm } from "./pkg/add.js";
function add(n: number): number {
if (n <= 0) return 0;
let sum = 0;
for (let i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
function recursive(n: number): number {
if (n <= 0) {
return 0;
} else {
return n + recursive(n - 1);
}
}
function reduce(n: number): number {
if (n <= 0) return 0;
return new Array(n).fill(0).map((_, i) => i + 1).reduce((a, c) => a + c);
}
Deno.test({
name: "add",
fn() {
assertEquals(6, add(3));
assertEquals(10, add(4));
assertEquals(1, add(1));
assertEquals(0, add(0));
assertEquals(0, add(-10));
},
});
Deno.test({
name: "recursive",
fn() {
assertEquals(6, recursive(3));
assertEquals(10, recursive(4));
assertEquals(1, recursive(1));
assertEquals(0, recursive(0));
assertEquals(0, recursive(-10));
}
});
Deno.test({
name: "reduce",
fn() {
assertEquals(6, reduce(3));
assertEquals(10, reduce(4));
assertEquals(1, reduce(1));
assertEquals(0, reduce(0));
assertEquals(0, reduce(-10));
},
});
Deno.test({
name: "wasm",
fn() {
assertEquals(6, wasm(3));
assertEquals(10, wasm(4));
assertEquals(1, wasm(1));
assertEquals(0, wasm(0));
assertEquals(0, wasm(-10));
},
});
bench({
name: "add",
runs: 1001,
func(b) {
b.start();
for (let i = 0; i < 1e5; i++) {
add(1000);
}
b.stop();
},
});
bench({
name: "recursive",
runs: 1002,
func(b) {
b.start();
for (let i = 0; i < 1e5; i++) {
recursive(1000);
}
b.stop();
}
});
bench({
name: "reduce",
runs: 1003,
func(b) {
b.start();
for (let i = 0; i < 1e5; i++) {
reduce(1000);
}
b.stop();
},
});
bench({
name: "wasm",
runs: 1004,
func(b) {
b.start();
for (let i = 0; i < 1e5; i++) {
wasm(1000);
}
b.stop();
},
});
runBenchmarks();
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn add(n: i32) -> i32 {
if n <= 0 {
return 0;
}
let mut sum = 0;
for i in 1..n + 1 {
sum += i;
}
return sum;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment