As can be noted by increasing the argument in String#times, execution
time slows down dramatically and makes logarithmically identical curve
(to one produced my String#times in FireFox), yet of doubled order
magnitude.

An alternative method for IE exists that makes use of array
concatenation. Below are the tests, benchmarks and conclusions:

Object.extend(String.prototype, {
        times1: function(count) { // current method employed in Prototype
                var result = '';
                for (var i = 0; i < count; i++) result += this;
                return result;
        },
        times2: function(count) { // a method that works best in IE:
                for (var i = 0, result = []; i < count; i++) result.push(this);
                return result.join('');
        }
});

Unit tests:
    testTimes1: function() {with(this) { /* */
          for (var i = 55, j = 34, k; i < 10000; k = i + j, j = i, i = k) //
using fibonacci series to use for arguments
                  benchmark(function() { 'foo'.times1(i); }, 100);
    }},

    testTimes2: function() {with(this) { /* */
          for (var i = 55, j = 34, k; i < 10000; k = i + j, j = i, i = k)
                benchmark(function() { 'foo'.times2(i); }, 100);
    }},

Results in FF:
passed  testTimes1      7 assertions, 0 failures, 0 errors
Info: Operation finished 100 iterations in 0.015s (1)
Info: Operation finished 100 iterations in 0.016s (2)
Info: Operation finished 100 iterations in 0.031s (3)
Info: Operation finished 100 iterations in 0.063s (4)
Info: Operation finished 100 iterations in 0.078s (5)
Info: Operation finished 100 iterations in 0.406s (6)
Info: Operation finished 100 iterations in 0.406s (7)
Info: Operation finished 100 iterations in 0.563s (8)
Info: Operation finished 100 iterations in 0.922s (9)
Info: Operation finished 100 iterations in 1.468s (10)
Info: Operation finished 100 iterations in 2.266s (11)
passed  testTimes2      7 assertions, 0 failures, 0 errors
Info: Operation finished 100 iterations in 0.031s (1)
Info: Operation finished 100 iterations in 0.047s (2)
Info: Operation finished 100 iterations in 0.078s (3)
Info: Operation finished 100 iterations in 0.125s (4)
Info: Operation finished 100 iterations in 0.172s (5)
Info: Operation finished 100 iterations in 0.297s (6)
Info: Operation finished 100 iterations in 0.687s (7)
Info: Operation finished 100 iterations in 0.985s (8)
Info: Operation finished 100 iterations in 1.422s (9)
Info: Operation finished 100 iterations in 2.453s (10)
Info: Operation finished 100 iterations in 7.297s (11)

Results in IE:
passed testTimes1 7 assertions, 0 failures, 0 errors
Info: Operation finished 100 iterations in 0.031s (1)
Info: Operation finished 100 iterations in 0.078s (2)
Info: Operation finished 100 iterations in 0.141s (3)
Info: Operation finished 100 iterations in 0.5s (4)
Info: Operation finished 100 iterations in 0.875s (5)
Info: Operation finished 100 iterations in 1.828s (6)
Info: Operation finished 100 iterations in 5.281s (7) !!!
Info: Operation finished 100 iterations in 11.781s (8) !!!
Info: Operation finished 100 iterations in 29.156s (9)  !!!
Info: Operation finished 100 iterations in 70.813s (10) !!!
Info: Operation finished 100 iterations in 184.812s (11) !!!!
passed testTimes2 7 assertions, 0 failures, 0 errors
Info: Operation finished 100 iterations in 0.047s (1)
Info: Operation finished 100 iterations in 0.063s (2)
Info: Operation finished 100 iterations in 0.078s (3)
Info: Operation finished 100 iterations in 0.172s (4)
Info: Operation finished 100 iterations in 0.234s (5)
Info: Operation finished 100 iterations in 0.406s (6)
Info: Operation finished 100 iterations in 0.719s (7)
Info: Operation finished 100 iterations in 1.094s (8)
Info: Operation finished 100 iterations in 1.859s (9) (15.9 times
better)
Info: Operation finished 100 iterations in 2.891s (10) (24.5 times
better)
Info: Operation finished 100 iterations in 4.5s  (11) (40 times
better!)

Can it be considered that more suiting method is used for IE?
Like:
if (Prototype.Browser.IE) {
  String.prototype.times = function(count) {
    for (var i = 0, result = []; i < count; i++) result.push(this);
    return result.join('');
  };
}

Thanks!


Best regards,

Andrew Revinsky


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype: Core" group.
To post to this group, send email to prototype-core@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/prototype-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to