匿名函数自我调用_4种执行函数方法的速度大PK

本文对比了四种执行函数的方法:直接调用、匿名函数、feval和eval,发现直接调用速度最快,eval最慢。尽管速度递减,但灵活性增加。经过测试,即使在不同函数上,速度排名保持不变。作者根据读者建议增加了带名义变量的匿名函数测试,并分享了如何通过改写匿名函数和feval提升代码速度的实践案例。
摘要由CSDN通过智能技术生成

ded0bc15e66d9e2480711983ed4b0288.png
fun = 'round';
x1 = pi;

%%
disp('直接调用函数:')
tic;
for ii = 1:1e3
    y = round(x1);
end
t1 = toc;
t1/t1
%%
disp('匿名函数(加入名义变量):');
f = @(x) round(x);
tic;
for ii = 1:1e3
    y = f(x1);
end
t2 = toc;
t2/t1

disp('匿名函数(不加名义变量):');
f = @round;
tic;
for ii = 1:1e3
    y = f(x1);
end
t22 = toc;
t22/t1
%%
disp('feval:')
tic;
for ii = 1:1e3
    y = feval(fun,x1);
end
t3 = toc;
t3/t1
%%
disp('eval:');
tic;
for ii = 1:1e3
    eval(sprintf('y = %s(%f);', fun, x1));
end
t4 = toc;
t4/t1

结果:

直接调用函数:
ans =
     1
匿名函数(加入名义变量):
ans =
    2.7234
匿名函数(不加名义变量):
ans =
   15.1915
feval:
ans =
  171.8809
eval:
ans =
  575.8681

总结:

测试了4种常见的执行函数的方法.

第一种, 直接调用函数, 这恐怕是最常用的方法了(可能有超过一半的用户只知道这一种).

发现这种方法速度是最快的.

第二种, 匿名函数, 这个方法第二快. 其中加入名义变量要比不加入名义变量要快.

第三种, 通过feval执行, 这个方法是第三快的.

第四种, 通过eval执行, 这个方法是最慢的.

我们发现, 这四种速度是越来越慢的, 但是使用灵活性是越来越高的.

因此, 用户可以根据自己的需要选择合适的方法.

随机测试了几个函数, 这些方法具体速度倍数有差别, 但是名次不变, 都是越来越慢的.

如果读者发现有例外的, 可以在评论区里面留言.

感谢 @Falccm 的建议.

在原有的文章的基础上:

1 增加了带有名义变量匿名函数的测试

2 脚本运行多次, 直接调用函数法的优势更大了. 原因是: 函数第一次运行时, 比较慢, 第二次或以上, 就开始JIT了, 会提速.

----更新-----------------------------------------------------------------------------------

没想到很快利用了这种加速技巧.

最近加速了一个第三方库.

里面大量的使用的匿名函数和feval.

更夸张的是: 匿名函数套匿名函数, 最多套了5层!

我将这些匿名函数和feval都改成了普通函数.

虽然花了不少时间(周末两天, 主要是代码量挺大的, 而且嵌套层数比较多), 改完了以后, 速度是原先的2倍左右.

创作不易, 请大家"素质三连": 点赞, 收藏, 分享.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值