aboutsummaryrefslogtreecommitdiff
path: root/benchmark/permutations.ts
diff options
context:
space:
mode:
authorUri Shaked2019-12-01 23:18:22 +0200
committerUri Shaked2019-12-01 23:18:34 +0200
commit27ea13401dfa443243d588c5636c85e1037b986d (patch)
tree77c4c63c8962bc9b066aa2307a156d25f1128f41 /benchmark/permutations.ts
parentfeat: add benchmarking code (diff)
downloadavr8js-27ea13401dfa443243d588c5636c85e1037b986d.tar.gz
avr8js-27ea13401dfa443243d588c5636c85e1037b986d.tar.bz2
avr8js-27ea13401dfa443243d588c5636c85e1037b986d.zip
feat: improve benchmark code
compare 3 alternatives: 1. Current avrInstruction() implementation 2. Map opcodes using a Javascript map 3. Map opcodes using a Uint16Array and big switch statement
Diffstat (limited to 'benchmark/permutations.ts')
-rw-r--r--benchmark/permutations.ts23
1 files changed, 23 insertions, 0 deletions
diff --git a/benchmark/permutations.ts b/benchmark/permutations.ts
new file mode 100644
index 0000000..4465557
--- /dev/null
+++ b/benchmark/permutations.ts
@@ -0,0 +1,23 @@
+export function* permutations(pattern: string) {
+ let totalPerms = 1;
+ for (const char of pattern) {
+ if (char !== '0' && char !== '1') {
+ totalPerms *= 2;
+ }
+ }
+
+ for (let permIndex = 0; permIndex < totalPerms; permIndex++) {
+ let varIndex = 0;
+ let value = 0;
+ for (const char of pattern) {
+ value *= 2;
+ if (char === '1') {
+ value++;
+ } else if (char !== '0') {
+ value += permIndex & (1 << varIndex) ? 1 : 0;
+ varIndex++;
+ }
+ }
+ yield value;
+ }
+}