JSFiddle - React, Tailwind, and code Playground

Simple LCG Duplication Test with Large Dictionary Indexing

by skibulk

HTML

<p><button id="toggleButton">Start/Stop</button></p>
<p>Dictionary Volumes: <span id="volumeCount"></span></p>
<p>Dictionary Keys: <span id="keyCount"></span></p>
<p>Duplicate Keys: <span id="duplicateCount"></span></p>

JavaScript

console.clear();

var toggleButton = document.getElementById("toggleButton");
var volumeCount = document.getElementById("volumeCount");
var keyCount = document.getElementById("keyCount");
var duplicateCount = document.getElementById("duplicateCount");

var stop = true;
var dict = new BigDict();
var seed = 2100483647;
var duplicates = 0;

toggleButton.onclick = function() {
  if (stop) {
  	stop = false;
    runner = setTimeout(run, 100);
  } else {
  	stop = true;
  }
}

function run() {
  for (var i = 0; i < 1e6; i++) {
  	// https://gist.github.com/blixt/f17b47c62508be59987b
    // 1993 Park-Miller LCC
    seed = seed * 48271 % 2147483647;
    if (dict.get(seed)) duplicates++;
    dict.set(seed, true);
  }
  volumeCount.innerHTML = dict.volumes;
  keyCount.innerHTML = ((dict.volumes - 1) * (dict.keyLimit + 1)) + dict.keyCount;
  duplicateCount.innerHTML = duplicates;
  if (!stop) setTimeout(run, 100);
}

// Utils --------------------------

function BigDict() {
  var dict = [];
  dict.push(dict.current = {});
  dict.volumes = 1;
  dict.keyCount = 0;
  dict.keyLimit = 8e6 - 1;

  dict.set = function(key, value) {
    dict.current[key] = value;
    if (dict.keyCount++ == dict.keyLimit) {
      dict.push(dict.current = {});
      dict.volumes++;
      dict.keyCount = 0;
    }
  }

  dict.get = function(key) {
    for (var i = 0; i < dict.length; i++) {
      var value = dict[i][key];
      return value !== undefined ? value : undefined;
    }
  }

  return dict;
}