作者sk1765 (鼎玉铉)
看板Ajax
标题Re: [问题] 程式执行效率的问题
时间Mon Jan 24 02:10:12 2011
var input = [],output=[];
var input1=[],output1=[];
function times(n, f) {
var c=0;
return function() {
var args = [];
for(var i=0,j=arguments.length; i<j; i++) {
alert("[i=" + i + "][c=" +c+ "]: " +arguments[i]); //<-增加了这行观测
args.push(arguments[i]);
}
if(c<n) {
c++;
return f.apply(this, args);
} else {
return null;
}
};
}
var work = function(res) {
return res.shift();
};
var f1 = times(10, work);
var r1 = function(res, f) {
var ret = f(res);
if(null !== ret) {
output.push(ret);
r1(res, f);
}
};
var r2 = function(n) {
for(var i=0; i<n; i++) {
output1.push(work(input1));
}
};
function test1() {
input = [0,1,2,3,4,5,6,7,8,9];
output = [];
r1(input, f1);
}
function test2() {
input1 = [0,1,2,3,4,5,6,7,8,9];
output1 = [];
r2(10);
}
var count = 100000;
var d1 = new Date().getTime();
for(var i=0; i<count; i++) {
test1();
}
var d2 = (new Date().getTime()) - d1;
var d3 = new Date().getTime();
for(var i=0; i<count; i++) {
test2();
}
var d4 = (new Date().getTime()) - d3;
alert(d2);
alert(d4);
----------------------------------------------
以上程式我只增加了一行观测用
alert("[i=" + i + "][c=" +c+ "]: " +arguments[i]);
发现问题出在 var c变数
由於times 传回一个匿名函式 该匿名函式为一closure
c这个变数 由於closure的关系 将一直维持private的存在
所以当执行一万次test1时
for(var i=0; i<count; i++) {
test1();
}
只有第一次 c会由0-9 正常运作
後面的9999次test1 的执行 c都维持在10
也就是times fumction 一进去就跳出来 因为c>n 等於没执行
所以并不是test1的执行效率比test2高
而是test1只真正执行了一次 而test2执行了一万次
程式执行中 若觉得alert 10000次按的很辛苦 请用程式管理员直接结束ie or ff
---------------------------------------------
解决这个问题的方法如下
function test1() {
input = [0,1,2,3,4,5,6,7,8,9];
output = [];
r1(input, times(10, work));
}
test1 里面 r1(input,f1) 改成r1(input, times(10, work))
这两者是有差异的
times(10, work) 每次都会执行一遍 所以回传的匿名函式 c值重新归零
f1是一个指向传回来的匿名函式的指标 那个匿名函式一直没变
所以总结来说 应该是times的用法用错了
不能用f1= times(10, work);这样的写法
times函式每次使用时都必须呼叫一遍取得新的匿名函式 而不能只呼叫一遍
如果一定要用f1= times(10, work);这句则必须摆在r1之前如下:
function test1() {
input = [0,1,2,3,4,5,6,7,8,9];
output = [];
f1= times(10, work);
r1(input, f1);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.70.99.74
※ 编辑: sk1765 来自: 203.70.99.74 (01/24 02:26)
※ 编辑: sk1765 来自: 203.73.175.240 (01/24 12:14)
※ 编辑: sk1765 来自: 203.73.175.240 (01/24 12:18)
1F:推 fillano:感谢阿 01/31 10:08