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倍左右.
创作不易, 请大家"素质三连": 点赞, 收藏, 分享.