Javascript code for making my browser slow down

后端 未结 8 1847
野性不改
野性不改 2021-02-19 02:28

I\'m writing a library for WebWorkers, and I want to test the difference between running a script in the main page thread, versus in one or more workers. The problem is: I can\'

相关标签:
8条回答
  • 2021-02-19 02:40

    Try using the obvious (and bad) recursive implementation for the Fibonacci sequence:

    function fib(x) {
      if (x <= 0) return 0;
      if (x == 1) return 1;
      return fib(x-1) + fib(x-2);
    }
    

    Calling it with values of ~30 to ~35 (depending entirely on your system) should produce good "slow down" times in the range you seek. The call stack shouldn't get very deep and the algorithm is something like O(2^n).

    0 讨论(0)
  • 2021-02-19 02:50
    /**
     * Block CPU for the given amount of seconds
     * @param {Number} [seconds]
     */
    function slowdown(seconds = 0.5) {
      const start = (new Date()).getTime()
      let end = start
      while (end - start < seconds * 1000) {
        end = (new Date()).getTime()
      }
    }
    

    Calling this method will slow code down for the given amount of seconds (with ~200ms precision).

    0 讨论(0)
  • 2021-02-19 02:50

    Generate an array of numbers in reverse order and sort it.

    var slowDown = function(n){
      var arr = [];
      for(var i = n; i >= 0; i--){
        arr.push(i);
      }
      arr.sort(function(a,b){
        return a - b;
      });
      return arr;
    }
    

    This can be called like so:

    slowDown(100000);
    

    Or whatever number you want to use.

    0 讨论(0)
  • 2021-02-19 02:55

    Check out the benchmarking code referenced by the Google V8 Javascript Engine.

    0 讨论(0)
  • 2021-02-19 02:56

    Maybe this is what you are looking for:

        var threadTest = function(durationMs, outputFkt, outputInterval) {
            var startDateTime = (new Date()).getTime();
                counter = 0,
                testDateTime = null,
                since = 0, 
                lastSince = -1;
    
            do {
                testDateTime = (new Date()).getTime();
                counter++;
    
                since = testDateTime - startDateTime;
    
                if(typeof outputFkt != 'undefined' && lastSince != since && testDateTime % outputInterval == 0) {
                    outputFkt(counter, since);
                    lastSince = since;
                }
            } while(durationMs > since);
    
            if(typeof outputFkt != 'undefined') {
                    outputFkt(counter, since);
            }
    
            return counter;
        }
    

    This method will simply repeat a check in a loop

    durationMS - duartion it should run in miliseconds
    
    OPTIONAL:
    outputFkt - a callback method, for logging purpose function(currentCount, milisecondsSinceStart)
    outputInterval - intervall the output function will be called
    

    I figured since you do not want to test a real function, and even NP-Hard Problems have a ratio between input length and time this could be a easy way. You can measure performance at any interval and of course receive the number of loops as a return value, so you can easily measure how much threads interfere each others performance, with the callback even on a per cycle basis.

    As an example here is how i called it (jQuery and Dom usage are here, but as you can see optional)

    $(document).ready(function() {
        var outputFkt = function(counter, since) {
            $('body').append('<p>'+counter+', since '+since+'</p>');    
        };
    
        threadTest(1000, outputFkt, 20);
    
    });
    

    A last Warning: Of course this function can not be more exact than JS itself. Since modern Browsers can do much more than one cycle in one Milisecond, there will be a little tail that gets cut.

    Update

    Thinking about it... actually using the ouputFkt callback for more than just output could give great insight. You could pass a method that uses some shared properties, or you could use it to test great memory usage.

    0 讨论(0)
  • 2021-02-19 02:58

    Everyone seems determined to be complicated. Why not this?

    function waste_time(amount) {
        for(var i = 0; i < amount; i++);
    }
    

    If you're concerned the browser will optimize the loop out of existence entirely, you can make it marginally more complicated:

    function waste_time(amount) {
        var tot = 0;
        for(var i = 0; i < amount; i++)
            tot += i;
    }
    
    0 讨论(0)
提交回复
热议问题