emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
function __flash__arrayToXML(obj) {
    
var s = "<array>";
    
for (var i=0; i<obj.length; i++) {
        s 
+= "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
    }
    
return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
    
var s = "<arguments>";
    
for (var i=index; i<obj.length; i++) {
        s 
+= __flash__toXML(obj[i]);
    }
    
return s+"</arguments>";
}
function __flash__objectToXML(obj) {
    
var s = "<object>";
    
for (var prop in obj) {
        s 
+= "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
    }
    
return s+"</object>";
}
function __flash__escapeXML(s) {
    
return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
}
function __flash__toXML(value) {
   var type = typeof(value);
    if (type == 
"string") {
        return 
"<string>" + __flash__escapeXML(value) + "</string>";
    } else if (type == 
"undefined") {
        return 
"<undefined/>";
    } else if (type == 
"number") {
        return 
"<number>" + value + "</number>";
    } else if (value == null) {
        return 
"<null/>";
    } else if (type == 
"boolean") {
        return value ? 
"<true/>" : "<false/>";
    } else if (value instanceof Date) {
        return 
"<date>" + value.getTime() + "</date>";
   } else if (value instanceof Array) {
       return __flash__arrayToXML(value);
   } else if (type == 
"object") {
       return __flash__objectToXML(value);
   } else {
        return 
"<null/>"; //???
    }
}
function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction(
"<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}
function __flash__removeCallback(instance, name) {
  instance[name] = null;
}

啥都甭说了,看看上面这几个“+=”,已经把啥都说了。刚看到youyee同学定位到一个严重性能瓶颈并表情上面把这段flash往页面里面注入的代码贴出来的时候,emu简直无法相信。
还好大家都是干这行的,在flash注入完上述脚本后再覆盖(一开始误为重载了,感谢jee等同学的)掉这几个函数并不为难,最多就是为之难受罢了。
posted on 2010-01-16 13:09 emu 阅读(3704) 评论(7)  编辑  收藏

评论

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-01-16 20:39 匿名
还好大家都是干这行的,在flash注入完上述脚本后再重载掉这几个函数并不为难,最多就是为之难受罢了。

重载和覆盖都分不清,不过是五十步笑百步  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-01-17 00:28 jee
javascript里对字符串不能用+=吗?javascript又不是java(java里面这样用才实效率低下)。
你对重载的理解有误,楼上的已经指出了。  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-01-17 09:25 xpf7622
前天我匆匆的看了一下,没仔细看,我以为JS里+=操作效率低下,也就没有仔细看。是啊,重载和覆盖(c++,Java)都涉及,这个弄不明白,就有些问题了。
网上好象没有人说JS里+=效率低下。如果有高见,不妨说一下。
  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-01-17 10:55 Feenn
这是对的,这个确实影响效率,网上可以找到其他人做的测试。http://topic.csdn.net/t/20051214/15/4459147.html  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-01-18 10:02 emu
@匿名
@jee
批评的对呵呵,有5年没写java了(c++更不要说了)。
当时脑子里面闪过了一下,override中文怎么说的来着,没细想就写成重载了。
其实这个地方并不是面向对象编程中所谓的重载或者覆盖了,不涉及到类的继承,纯粹就是一个函数覆盖一个函数。确实应该用“覆盖”的。

@xpf7622
不是“+=”效率有问题,是对字符串连续的“+=”有性能问题。在IE8以前的IE浏览器中,字符串拼接有和java中一样的问题。因此不建议在循环中对字符串使用“+=”  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-03-12 00:05 yukon
不大肯定清楚as里+=会不会有效率问题,
但同个祖宗的js用字符串大量+=的确是有效率问题。
因为ECMAscript中字符串是值类型而不是引用型。一般解决方法是把每个字符串放入一个数组的数组项,再拼接这个数组。  回复  更多评论
  

# re: flash player往页面注入的脚本表现了adobe的临时工水平 2010-03-12 00:16 emu
@yukon
一些新浏览器的javascript引擎对这个问题有一些优化,但是现在浏览器的主流还是IE6,字符串拼接效率低是无疑的。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: