首先让我说这不是我通常要做的事情,但是出于好奇,我将看看是否有人对如何处理这样的问题有个好主意。

我正在处理的应用程序是具有Monty Hall问题的游戏Let's make a Deal的模拟示例。

我不会详细介绍实现方式,但是它或多或少地允许用户输入他们要模拟的游戏数量,然后如果关闭某个选项,则这x个游戏的玩家将不会切换选择,如果将其打开,他们将在游戏的每个实例中切换选择。

我的对象生成器如下所示:

const game = function(){
    this[0] = null;
    this[1] = null;
    this[2] = null;
    this.pick = Math.floor(Math.random() * 3);
    this.correctpick = Math.floor(Math.random() * 3);
    this[this.correctpick] = 1;
    for (let i=0; i<3; i++){
        if ((this[i] !== 1) && (i !== this.pick)){
            this.eliminated = i;
            break;
        }
    }
}

const games = arg => {
    let ret = [];
    for(let i=0; i<arg; i++){
        ret.push(new game);
    }
    return ret;
}


此结构生成一个数组,稍后我将其进行字符串化,如下所示:

[
  {
    "0": 1,
    "1": null,
    "2": null,
    "pick": 2,
    "correctpick": 0,
    "eliminated": 1
  },
  {
    "0": null,
    "1": null,
    "2": 1,
    "pick": 2,
    "correctpick": 2,
    "eliminated": 0
  }
]


就像游戏的构造函数看起来那样草率,原因是因为我将其重构为具有尽可能少的函数调用,而现在我实际上只是在当前时间调用Math函数(我删除了制作代码的所有辅助函数更易于阅读,以提高性能)。

该应用程序既可以在浏览器中运行,也可以在节点(跨平台)中运行,但是我将用户可以传入游戏功能的参数限制为500万。超过此时间,进程(或窗口)冻结的时间将超过几秒钟,甚至可能崩溃。

如果用户提供了大量的信息,我还能做些什么来提高性能?另外,如果您需要更多信息,我们将很乐意提供!

谢谢!

最佳答案

不确定您的实现,但是您真的需要Array吗?

仅使用结果如何(请参见代码段)?

如果它阻止了让您担心的浏览器,则可以将工作委派给web worker是针对此问题的解决方案:有关此代码段的网络工作者版本,请参见this jsFiddle



(() => {
  document.querySelector("#doit")
  	.addEventListener("click", playMontyHall().handleRequest);

  function playMontyHall() {
    const result = document.querySelector("#result");
    const timing = document.querySelector("#timing");
    const nOfGames = document.querySelector("#nGames");
    const switchDoors = document.querySelector("#switchyn");

    // Create a game
    const game = (doSwitch) => {
      const doors = [0, 1, 2];
      const pick = Math.floor(Math.random() * 3);
      const correctPick = Math.floor(Math.random() * 3);
      const eliminated = doors.filter(v => v !== pick && v !== correctPick)[0];

      return {
        correctpick: correctPick,
        pick: doSwitch ? doors.filter(v => v !== pick && v !== eliminated)[0] : pick,
        eliminated: eliminated,
      };
    };

    const getWinner = game  => ~~(game.correctpick === game.pick);

    // Sum  wins using a generator function
    const winningGenerator = function* (doSwitch, n) {
      let wins = 0;

      while (n--) {
        wins += getWinner(game(doSwitch));
        yield wins;
      }
    };

    // calculate the number of succeeded games
    const calculateGames = (nGames, switchAlways) => {
      const funNGames = winningGenerator(switchAlways, nGames);
      let numberOfWins = 0;

      while (nGames--) {
        numberOfWins = funNGames.next().value;
      }

      return numberOfWins;
    }

    const cleanUp = playOut => {
    	result.textContent =
        "Playing ... (it may last a few seconds)";
      timing.textContent = "";
      setTimeout(playOut, 0);
    };

    const report = results => {
    	timing.textContent = `This took ${
       	 (performance.now() - results.startTime).toFixed(3)} milliseconds`;
      result.innerHTML =
         `<b>${!results.switchAlways ? "Never s" : "Always s"}witching doors</b>:
         ${results.winners} winners out of ${results.nGames} games
         (${((results.winners/+results.nGames)*100).toFixed(2)}%)`;
    };

    // (public) handle button click
    function clickHandle() {

      cleanUp(() => {
        const nGames = nOfGames.value || 5000000;
        const switchAlways = switchDoors.checked;
        report({
          switchAlways: switchAlways,
        	startTime: performance.now(),
          winners: calculateGames(nGames, switchAlways),
          nGames: nGames
        });
      });

    }

    return {
      handleRequest: clickHandle
    };
  }

})();

body {
  margin: 2em;
  font: normal 12px/15px verdana, arial;
}

#timing {
  color: red;
}

<p><input type="number" id="nGames" value="5000000"> N of games</p>
<p><input type="checkbox" id="switchyn"> Always switch doors</p>
<p><button id="doit">Play</button>
<p id="result"></p>
<p id="timing"></p>

关于javascript - 用Javascript创建数百万个对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48485167/

10-12 00:10
查看更多