試行錯誤の結果
何回かやって得られた感想を箇条書き
- start関数を叩くまでタイムがスタートしない
- 初期処理のコストは実質0
- 関数や変数等の準備を十分行ってから望む事が出来る
- cash、items、pricesは単なる変数に思えるが上書きできない
- ES6で実装されたgetterを使っているものと思われる
- 本気でハックすれば突破出来る?…多分不可能なのだろう
- 用意されているloop関数は超絶遅い
- 2番目の引数がms単位でsetIntervalと同じ作りだと思われる
- 製作者が発表している0.8sですら、1msに1度しか実行できないloop関数では800回程度しか実行出来ない
- 800回のwork()で1億とか到底無理で、関数内でfor文を回して1000回程度のwork()を叩きまくる糞関数を定義することになる
- つか、それがまかりとおるなら最初からfor文で回せばよくね?
- 1秒以内に何万とwork()関数を実行する為、shikakuとprogramming以外は取る必要無し
- if文は遅い
- 条件判定式自体のコストはそれほどではないのだが、何万work()を実行する事になるのでその度に調査していては無駄。
- for、whileと様々なループ文を試してみたが、再帰関数が最速なようだ
- あくまでElectronで使われているV8のエンジン固有の話だと思われる
これが多分最速だと思います
うちの環境(MacbookPro Retina13インチ)で0.24秒をマークした。
works_num = function(num) {
return function(){
for (var i = 0; i < num; i++) {
work();
}
}
};
shikaku = function shikakutore(it, works, loop){
return function(){
for (var i = 0; i < loop; i++) {
works();
purchase(it);
}
};
};
shikaku_tore = shikaku(0, works_num(20), 25);
program_tore = shikaku(4, works_num(500), 1);
hatarake = (function(){
function hatarake(){
shikaku_tore();
program_tore();
cash < 100000000 ? hatarake() : null;
}
return hatarake;
})();
start();
hatarake();
宿題
空き時間を利用してこつこつチューニングしたが、 このやり方ではこれ以上の速度増加が不可能と判断。
ん、閃いた!これやれば絶対最速に1億稼ぐロジックになるわ。 働クリッカーの動作を解析すればいけるな。 詳細は別記事で公開しようと思う。