Skip to content

Commit 6b6dfca

Browse files
committed
1 parent 9972ed1 commit 6b6dfca

File tree

13 files changed

+537
-231
lines changed

13 files changed

+537
-231
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
"use strict";
2+
exports.__esModule = true;
3+
/* eslint-disable @typescript-eslint/no-var-requires */
4+
/* eslint-disable no-console */
5+
var Benchmark = require("benchmark");
6+
var mod_js_1 = require("./mod.js");
7+
var fast_levenshtein_1 = require("fast-levenshtein");
8+
var fs = require("fs");
9+
var jslevenshtein = require("js-levenshtein");
10+
var leven = require("leven");
11+
var levenshteinEditDistance = require("levenshtein-edit-distance");
12+
var suite = new Benchmark.Suite();
13+
var randomstring = function (length) {
14+
var result = "";
15+
var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
16+
var charactersLength = characters.length;
17+
for (var i = 0; i < length; i++) {
18+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
19+
}
20+
return result;
21+
};
22+
var randomstringArr = function (stringSize, arraySize) {
23+
var i = 0;
24+
var arr = [];
25+
for (i = 0; i < arraySize; i++) {
26+
arr.push(randomstring(stringSize));
27+
}
28+
return arr;
29+
};
30+
var arrSize = 1000;
31+
if (!fs.existsSync("data.json")) {
32+
var data_1 = [
33+
randomstringArr(4, arrSize),
34+
randomstringArr(8, arrSize),
35+
randomstringArr(16, arrSize),
36+
randomstringArr(32, arrSize),
37+
randomstringArr(64, arrSize),
38+
randomstringArr(128, arrSize),
39+
randomstringArr(256, arrSize),
40+
randomstringArr(512, arrSize),
41+
randomstringArr(1024, arrSize),
42+
];
43+
fs.writeFileSync("data.json", JSON.stringify(data_1));
44+
}
45+
var data = JSON.parse(fs.readFileSync("data.json", "utf8"));
46+
var _loop_1 = function (i) {
47+
var datapick = data[i];
48+
if (process.argv[2] !== "no") {
49+
suite
50+
.add("".concat(i, " - js-levenshtein"), function () {
51+
for (var j = 0; j < arrSize - 1; j += 2) {
52+
jslevenshtein(datapick[j], datapick[j + 1]);
53+
}
54+
})
55+
.add("".concat(i, " - leven"), function () {
56+
for (var j = 0; j < arrSize - 1; j += 2) {
57+
leven(datapick[j], datapick[j + 1]);
58+
}
59+
})
60+
.add("".concat(i, " - fast-levenshtein"), function () {
61+
for (var j = 0; j < arrSize - 1; j += 2) {
62+
(0, fast_levenshtein_1.get)(datapick[j], datapick[j + 1]);
63+
}
64+
})
65+
.add("".concat(i, " - levenshtein-edit-distance"), function () {
66+
for (var j = 0; j < arrSize - 1; j += 2) {
67+
levenshteinEditDistance(datapick[j], datapick[j + 1]);
68+
}
69+
});
70+
}
71+
suite.add("".concat(i, " - fastest-levenshtein"), function () {
72+
for (var j = 0; j < arrSize - 1; j += 2) {
73+
(0, mod_js_1.distance)(datapick[j], datapick[j + 1]);
74+
}
75+
});
76+
};
77+
// BENCHMARKS
78+
for (var i = 0; i < 9; i++) {
79+
_loop_1(i);
80+
}
81+
var results = new Map();
82+
suite
83+
.on("cycle", function (event) {
84+
console.log(String(event.target));
85+
if (results.has(event.target.name[0])) {
86+
results.get(event.target.name[0]).push(event.target.hz);
87+
}
88+
else {
89+
results.set(event.target.name[0], [event.target.hz]);
90+
}
91+
})
92+
.on("complete", function () {
93+
console.log(results);
94+
})
95+
// run async
96+
.run({ async: true });
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare const distance: (a: string, b: string) => number;
2+
declare const closest: (str: string, arr: readonly string[]) => string;
3+
export { closest, distance };
4+
//# sourceMappingURL=mod.d.ts.map
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAiHA,QAAA,MAAM,QAAQ,MAAO,MAAM,KAAK,MAAM,KAAG,MAaxC,CAAC;AAEF,QAAA,MAAM,OAAO,QAAS,MAAM,OAAO,SAAS,MAAM,EAAE,KAAG,MAWtD,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC"}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
const peq = new Uint32Array(0x10000);
2+
const myers_32 = (a, b) => {
3+
const n = a.length;
4+
const m = b.length;
5+
const lst = 1 << (n - 1);
6+
let pv = -1;
7+
let mv = 0;
8+
let sc = n;
9+
let i = n;
10+
while (i--) {
11+
peq[a.charCodeAt(i)] |= 1 << i;
12+
}
13+
for (i = 0; i < m; i++) {
14+
let eq = peq[b.charCodeAt(i)];
15+
const xv = eq | mv;
16+
eq |= ((eq & pv) + pv) ^ pv;
17+
mv |= ~(eq | pv);
18+
pv &= eq;
19+
if (mv & lst) {
20+
sc++;
21+
}
22+
if (pv & lst) {
23+
sc--;
24+
}
25+
mv = (mv << 1) | 1;
26+
pv = (pv << 1) | ~(xv | mv);
27+
mv &= xv;
28+
}
29+
i = n;
30+
while (i--) {
31+
peq[a.charCodeAt(i)] = 0;
32+
}
33+
return sc;
34+
};
35+
const myers_x = (b, a) => {
36+
const n = a.length;
37+
const m = b.length;
38+
const mhc = [];
39+
const phc = [];
40+
const hsize = Math.ceil(n / 32);
41+
const vsize = Math.ceil(m / 32);
42+
for (let i = 0; i < hsize; i++) {
43+
phc[i] = -1;
44+
mhc[i] = 0;
45+
}
46+
let j = 0;
47+
for (; j < vsize - 1; j++) {
48+
let mv = 0;
49+
let pv = -1;
50+
const start = j * 32;
51+
const vlen = Math.min(32, m) + start;
52+
for (let k = start; k < vlen; k++) {
53+
peq[b.charCodeAt(k)] |= 1 << k;
54+
}
55+
for (let i = 0; i < n; i++) {
56+
const eq = peq[a.charCodeAt(i)];
57+
const pb = (phc[(i / 32) | 0] >>> i) & 1;
58+
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
59+
const xv = eq | mv;
60+
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
61+
let ph = mv | ~(xh | pv);
62+
let mh = pv & xh;
63+
if ((ph >>> 31) ^ pb) {
64+
phc[(i / 32) | 0] ^= 1 << i;
65+
}
66+
if ((mh >>> 31) ^ mb) {
67+
mhc[(i / 32) | 0] ^= 1 << i;
68+
}
69+
ph = (ph << 1) | pb;
70+
mh = (mh << 1) | mb;
71+
pv = mh | ~(xv | ph);
72+
mv = ph & xv;
73+
}
74+
for (let k = start; k < vlen; k++) {
75+
peq[b.charCodeAt(k)] = 0;
76+
}
77+
}
78+
let mv = 0;
79+
let pv = -1;
80+
const start = j * 32;
81+
const vlen = Math.min(32, m - start) + start;
82+
for (let k = start; k < vlen; k++) {
83+
peq[b.charCodeAt(k)] |= 1 << k;
84+
}
85+
let score = m;
86+
for (let i = 0; i < n; i++) {
87+
const eq = peq[a.charCodeAt(i)];
88+
const pb = (phc[(i / 32) | 0] >>> i) & 1;
89+
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
90+
const xv = eq | mv;
91+
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
92+
let ph = mv | ~(xh | pv);
93+
let mh = pv & xh;
94+
score += (ph >>> (m - 1)) & 1;
95+
score -= (mh >>> (m - 1)) & 1;
96+
if ((ph >>> 31) ^ pb) {
97+
phc[(i / 32) | 0] ^= 1 << i;
98+
}
99+
if ((mh >>> 31) ^ mb) {
100+
mhc[(i / 32) | 0] ^= 1 << i;
101+
}
102+
ph = (ph << 1) | pb;
103+
mh = (mh << 1) | mb;
104+
pv = mh | ~(xv | ph);
105+
mv = ph & xv;
106+
}
107+
for (let k = start; k < vlen; k++) {
108+
peq[b.charCodeAt(k)] = 0;
109+
}
110+
return score;
111+
};
112+
const distance = (a, b) => {
113+
if (a.length < b.length) {
114+
const tmp = b;
115+
b = a;
116+
a = tmp;
117+
}
118+
if (b.length === 0) {
119+
return a.length;
120+
}
121+
if (a.length <= 32) {
122+
return myers_32(a, b);
123+
}
124+
return myers_x(a, b);
125+
};
126+
const closest = (str, arr) => {
127+
let min_distance = Infinity;
128+
let min_index = 0;
129+
for (let i = 0; i < arr.length; i++) {
130+
const dist = distance(str, arr[i]);
131+
if (dist < min_distance) {
132+
min_distance = dist;
133+
min_index = i;
134+
}
135+
}
136+
return arr[min_index];
137+
};
138+
export { closest, distance };

node_modules/fastest-levenshtein/index.d.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

node_modules/fastest-levenshtein/index.js

Lines changed: 0 additions & 147 deletions
This file was deleted.

0 commit comments

Comments
 (0)