matlab函数形参可以是文件位置吗_MATLAB代码提速技巧之In-place Optimizations

d637dcb6c4d45833bcf16ce047ad6c2a.png
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是为了高性能而生的语言.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值