查看: 175|回复: 3|关注: 0

[已解决] 请教一个class赋值效率过低的问题

[复制链接]

新手

18 麦片

财富积分


050


3

主题

16

帖子

1

最佳答案
问题描述:StructA与ClassA均只有一个成员变量t,假设测试数据量为N,以下四种形式循环赋值时,只有方法4效率极低
形式1:struct_a=StructA(N,1)
形式2:struct_b.t=zeros(N,1)
形式3:class_a=ClassA(N,1)
形式4:class_b.t=zeros(N,1)
当N=1E5,循环给每个t赋值时,前3个时间都在0.02s左右,第4个时间在4s左右
(请不必考虑为何要用循环赋值不用数组赋值的问题,这个问题只在探讨为何会出现这种现象)
这个问题在不同机器上都能复现,已反馈给matlab的技术支持,但尚未得到有效反馈,请教大家是否遇到过这种现象

附测试代码:
(class文件)
classdef ClassA
    properties
        t           double =0
    end
end
(测试文件)
clear
clc
close all
test_num = 1e5; %测试数据量
%% struct test
StructA = struct('t',[]);
struct_a = repmat(StructA,test_num,1); % 形式1
struct_b = StructA; % 形式2
struct_b.t = zeros(test_num,1); % 初始化
tic
for ii=1:test_num
    struct_a(ii).t = ii;
end
toc
tic
for ii=1:test_num
    struct_b.t(ii) = ii;
end
toc
%% class test
class_a(test_num) = ClassA;% 形式3
class_b = ClassA; % 形式4
class_b.t = zeros(test_num,1);% 初始化
tic
for ii=1:test_num
    class_a(ii).t = ii;
end
toc
tic
for ii=1:test_num
    class_b.t(ii) = ii;
end
toc

MATLAB 基础讨论
版块优秀回答者

入门

220 麦片

财富积分


50500


3

主题

324

帖子

48

最佳答案
  • 关注者: 2
发表于 2020-1-9 15:52:07 | 显示全部楼层 |此回复为最佳答案
R2017b下测试:
时间已过 0.023545 秒。
时间已过 0.017967 秒。
时间已过 0.015217 秒。
时间已过 0.030691 秒。
R2019b下测试:
历时 0.014519 秒。
历时 0.016754 秒。
历时 0.017409 秒。
历时 2.830530 秒。

看了下发行说明,可能是18版本的性能优化在这里起了反效果。

新手

18 麦片

财富积分


050


3

主题

16

帖子

1

最佳答案
 楼主| 发表于 2020-1-10 09:53:16 | 显示全部楼层
杰孑捷 发表于 2020-1-9 15:52
R2017b下测试:
时间已过 0.023545 秒。
时间已过 0.017967 秒。

感谢提醒
我找了几个不同版本的电脑测试了下,得出结论:
2016,2017版本是正常的
2018和2019版本就存在这个现象,看来确实是版本升级的负优化:L

新手

18 麦片

财富积分


050


3

主题

16

帖子

1

最佳答案
 楼主| 发表于 2020-1-10 11:20:23 | 显示全部楼层
再补充一下,已经得到mathwork技术支持的反馈,结论是这是一个已知bug,目前的解决方法是去掉class成员变量的属性校验
https://ww2.mathworks.cn/support/bugreports/2069154
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

快速回复 返回顶部 返回列表