概述
function main
x = rand(1e8, 1);
% 普通函数, 输入实参与输出实参相同
tic;
x = notInplace(x);
toc;
% 时间已过 0.254771 秒。
% 普通函数, 输入实参与输出实参不同
tic;
y = notInplace(x);
toc;
% 时间已过 0.201775 秒。
% in-place函数, 输入实参与输出实参相同
tic;
x = inplace(x);
toc;
% 时间已过 0.098609 秒。
% in-place函数, 输入实参与输出实参不同
tic;
y = inplace(x);
toc;
end
% 时间已过 0.255816 秒。
% 普通函数的定义是输入形参与输出形参不同
function y = notInplace(x)
y = 1.2*x;
end
% in-place函数的定义是输入形参与输出形参相同
function x = inplace(x)
x = 1.2*x;
end
根据输出形参与输入形参是否相同, 输出实参与输入实参是否相同, 总共2*2=4个示例.
发现, 只有输出形参与输入形参相同, 并且输出实参与输入实参相同(第三个示例), 才能加速.
原理是, 其他三个情况下, 函数计算完以后, 必须将输出变量拷贝出来, 而第三个示例不需要拷贝出来, 加速的部分其实就是节省下的拷贝时间.
当然, 这种优化只有在函数的计算时间很短, 同时数据量较大时, 才适用, 否则, 节省的拷贝时间占比很小, 可以忽略不计.
有兴趣的读者可以自己动手验证一下这句话, 比如将数据量从1e8, 改成1, 或者将运算从简单的乘法运算改为比较复杂的正弦运算.
多谢 @MEZhang 的提醒,我感觉inplace优化需要加上第三个必要条件: 函数内部中输入变量的维度(形状)不发生变化。因为如果发生变化,就要建立新的变量代替原先的,这样的话,退出函数时,还是得拷贝变量出去。
--------------2018年12月28日----------------------------
MATLAB的in-place操作是属于比较冷门的, 官方并没有正式公布这个优化技巧.
相反, Julia的in-place随处可见.
很多函数同时包含有了copy版与in-place版(函数名末尾加感叹号(!)的函数).
可以看出来, Julia是为了高性能而生的语言.
创作不易, 请大家"素质三连": 点赞, 收藏, 分享.
最后
以上就是传统糖豆为你收集整理的matlab函数形参可以是文件位置吗_MATLAB代码提速技巧之In-place Optimizations的全部内容,希望文章能够帮你解决matlab函数形参可以是文件位置吗_MATLAB代码提速技巧之In-place Optimizations所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复