javascript 字符串的乘法

 在ruby中我们可以通过"*"操作符去字符串进行倍增,如"ruby"*2则返回"rubyruby"。在javascript中,字符串只能用加号,嘛,乘法也加法演变过来的。我们可以搞一个试试。

方法一
  String.prototype.times = function(n) {//IE6 530-640 FF3 400~550 IE8 840 ~1110   chrome 600~1000
    return (new Array(n+1)).join(this);
  };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
  String.prototype.times = function(n) {
    return (new Array(n+1)).join(this);
  };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
  String.prototype.times = function(n) {
    return (new Array(n+1)).join(this);
  };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

创建一个n+1的空数组,调用join方法。

方法二
        String.prototype.times = function(n) {//IE6 570~600  FF3 320~430  chrome 550~900 IE8 422~490
          return Array.prototype.join.call({length:n+1}, this);
        };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
   String.prototype.times = function(n) {
      return Array.prototype.join.call({length:n+1}, this);
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
    String.prototype.times = function(n) {
      return Array.prototype.join.call({length:n+1}, this);
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

创建一个对象,拥有length属性,然后利用call()方法去调用数组原型的join方法。这样就不用创建数组了。

方法三
    String.prototype.times = (function(){//IE6 500~600  FF3 322~390 chrome 581~900 IE8 430~500
      var join = Array.prototype.join,//利用闭包,每次的结果都非常不稳定,让浏览器无法进行优化
      obj = { };
      return function(n) {
        obj.length = n + 1;
        return join.call(obj, this);
      }
    })();
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
    String.prototype.times = (function(){
      var join = Array.prototype.join,
      obj = { };
      return function(n) {
        obj.length = n + 1;
        return join.call(obj, this);
      }
    })();
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
    String.prototype.times = (function(){
      var join = Array.prototype.join,
      obj = { };
      return function(n) {
        obj.length = n + 1;
        return join.call(obj, this);
      }
    })();
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

它先把Array.prototype.join与对象缓存起来,这样每次就不用从Array的原型查找join方法与创建对象。

方法四
    String.prototype.times = function(n) {//IE6 75~110 FF3 26~31 chrome 49 IE8 110
      var s = this, total = [];
      while(n > 0) {
        if (n % 2 == 1) total[total.length] = s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
    String.prototype.times = function(n) {
      var s = this, total = [];
      while(n > 0) {
        if (n % 2 == 1) total[total.length] = s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
    String.prototype.times = function(n) {
      var s = this, total = [];
      while(n > 0) {
        if (n % 2 == 1) total[total.length] = s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

一到三都没有利用CPU的分支缓存( CPU branch caching),再结合位运算符,速度就会提高一个数量级了。

方法五
    String.prototype.times = function(n) {//IE6 47,FF3 20,chrome 57 IE8 97-107
      var s = this, c = n;
      do {
        s += s;
      } while (n = n>>1)
        s = s.substring(0, this.length * c);
      return s;
    };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
    String.prototype.times = function(n) {//IE6 47,FF3 20,chrome 57 IE8 97-107
      var s = this, c = n;
      do {
        s += s;
      } while (n = n>>1)
        s = s.substring(0, this.length * c);
      return s;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
    String.prototype.times = function(n) {//IE6 47,FF3 20,chrome 57 IE8 97-107
      var s = this, c = n;
      do {
        s += s;
      } while (n = n>>1)
        s = s.substring(0, this.length * c);
      return s;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

方法六
    String.prototype.times = function(n) {//IE6 47 FF3 26~27 chrome 0 IE8 0
      var s = this, total = "";
      while(n > 0) {
        if (n % 2 == 1) total += s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total;
    };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
     String.prototype.times = function(n) {//IE6 47 FF3 26~27 chrome 0 IE8 0
      var s = this, total = "";
      while(n > 0) {
        if (n % 2 == 1) total += s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
     String.prototype.times = function(n) {//IE6 47 FF3 26~27 chrome 0 IE8 0
      var s = this, total = "";
      while(n > 0) {
        if (n % 2 == 1) total += s;
        if (n == 1) break;
        s += s;
        n = n>>1;
      }
      return total;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

方法七
    String.prototype.times = function(n) {//IE6 31 FF3 18 IE8 0 chrome 0
      if( n == 1 ) {
        return this;
      }
      var s= this.times(Math.floor(n/2));
      s+= s;
      if ( n % 2 ) {
        s+= this;
      }
      return s;
    }
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
    String.prototype.times = function(n) {
      if( n == 1 ) {
        return this;
      }
      var s= this.times(Math.floor(n/2));
      s+= s;
      if ( n % 2 ) {
        s+= this;
      }
      return s;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
     String.prototype.times = function(n) {
      if( n == 1 ) {
        return this;
      }
      var s= this.times(Math.floor(n/2));
      s+= s;
      if ( n % 2 ) {
        s+= this;
      }
      return s;
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

方法八
    String.prototype.times = function(n) {//IE6 125 FF3 37 IE8 94~109 chrome 46
      var s = this, total = [];
      while(n> 0) {//不要写while(n)虽然当n等于0时也是终止循环,
                            //但这有个转型过程,把0转换为false,比不上n>0快
        if (n & 1) total[total.length] = s;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
 
<!doctype html>
<html dir="ltr" lang="zh-CN">
  <head>
    <meta charset="utf-8"/>
    <title>字符串的乘法</title>

    <script type="text/javascript" charset="utf-8">
      window.onload = function(){
      String.prototype.times = function(n) {
      var s = this, total = [];
      while(n> 0) {
        if (n & 1) total[total.length] = s;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
      
      }
    </script>
  </head>
  <body>
   <pre>
    String.prototype.times = function(n) {
      var s = this, total = [];
      while(n> 0) {
        if (n & 1) total[total.length] = s;
        s += s;
        n = n>>1;
      }
      return total.join('');
    };
    var s = "司徒正美"
    var start = new Date();
    a = s.times(1000000);
    var end = new Date();
    alert("所耗时间 "  + (end-start));
   </pre>
  </body>
</html>
 
运行代码

jion优化反而成为拖累!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cheng5128/archive/2009/11/08/4787833.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值