gpt4 book ai didi

performance - Matlab的Get Property函数导致性能问题

转载 作者:行者123 更新时间:2023-12-02 04:07:20 24 4
gpt4 key购买 nike

我在所创建的一个类中有一个属性,该属性当前具有与之关联的不必要的get函数。我最初使它在返回值之前做有用的事情,但是现在我只需要属性值,因此get函数已简化为:

    function value =  get.error(obj)
value = obj.error;
end

现在,由于看到这段代码是完全多余的,所以我决定一起删除get函数,但这会导致代码的某一部分出现令人难以置信的速度下降,在该部分中,重复访问'error'属性。

在这段代码中,探查器没有明确地说出缺少的get函数是问题的原因(它说所有时间都浪费在“for”循环的“末尾”),但是当我添加时回到功能上无用的代码后,性能问题就消失了。

为什么删除此无用的get函数会使我的代码变慢?

编辑:我已经隔离出足以发布一些代码示例的问题。

这是有问题的方法调用的虚拟版本:

这是没有无用的getter的代码配置文件:

和神奇的无用 setter/getter :

请注意,对性能的要求如下所示:
  • 在设置为任何变量的计算中使用“池”对象的某些属性。 “错误”属性引起了我的注意,但是该错误发生在相同情况下的所有属性中。
  • 计算涉及任何内容,即使'。* 0'也会导致这种减慢,但设置的单个项是无减慢的(例如obj.pools(i).delta = obj.pools(i).error)

  • 编辑2:

    这是全池 class ;也许会有所帮助:
    classdef pool < handle

    properties
    name;
    unit_count;
    activation;
    net_input = 0;
    %all projections now incoming
    projections = [];
    error; % same is dEd net for rbp
    target;
    clamped_error = false;
    delta;
    clamped_activation = 0; %0 no clamp, 1 soft clamp, 2 hard clamp
    copyback = false;
    copy_from;
    type = 'hidden';

    activation_history;
    error_history;

    end

    methods
    function obj = pool(name,count,type,copy_from)
    obj.name = name;
    assignin('caller', name, obj);
    obj.unit_count = count;
    obj.error = zeros(1,count);
    obj.target = zeros(1,count);
    obj.delta = zeros(1,count);
    obj.activation = zeros(1,count);
    obj.net_input = zeros(1,count);
    obj.activation_history(:,1) = zeros(1,count);
    obj.error_history(:,1) = zeros(1,count);
    if nargin > 2
    obj.type = type;
    if nargin == 4
    obj.clamped_activation = 2;
    obj.activation = ones(1,count)/2;
    obj.copy_from = copy_from;
    obj.copyback = true;
    end
    else
    obj.type = 'hidden';
    end
    switch obj.type
    case 'input'
    obj.clamped_activation = 2;
    case 'output'
    obj.clamped_error = true;
    case 'bias'
    obj.clamped_activation = 2;
    obj.activation = 1;
    case 'hidden'
    end

    end

    function proj = connect(obj,send_pool,proj_var)
    %see if you need a new projection or if the user provided one

    if nargin == 2
    proj = projection(obj, send_pool);
    else
    proj = proj_var;
    end
    obj.projections = [obj.projections struct('from',send_pool,'using',proj)];
    end


    function value = get.error(obj)
    value = obj.error;
    end

    end

    end

    最佳答案

    这听起来像Matlab JIT或解释器怪异。

    您可能正在查看与MCOS内存管理相关的Matlab错误,例如Dataset array indexing is very slow with Statistics Toolbox中讨论的错误。该错误看起来在某些情况下在引用对象的字段时会导致对象的虚假深度复制。如果池对象中有单元阵列或其他复杂结构,则可能导致类似的行为-它们被复制到新变量中,并且可能在“末尾”显示了释放成本。

    我能够在多个Matlab版本中重现类似的令人惊讶的缓慢结果。但是我无法证明它与 setter/getter 的存在没有任何区别。

    文件fooclass.m。

    classdef fooclass
    properties
    error = 42;
    whatever = 42;
    delta = 1;
    bigjunk = num2cell(rand(1000,40));
    %bigjunk = rand(1000,10000); % non-cell does not cause slowdown
    end

    methods
    % function out = get.error(obj)
    % out = obj.error;
    % end
    end

    end

    文件looper.m。
    classdef looper
    properties
    pools
    end

    methods
    function obj = looper()
    obj.pools = repmat(fooclass(), [1 5]);;
    end

    function weird(obj)
    p = obj.pools;
    n = numel(p);
    for i = 1:n
    dummy = obj.pools(i).error .* 0;
    end
    end
    end
    end

    复制:
    >> lp = looper;
    >> tic; for i = 1:100; weird(lp); end; toc
    Elapsed time is 0.600428 seconds.

    那是我在64位Windows 7上的R2011a(预发行版)上的速度。时间与bigjunk的大小成正比,分析器表示几乎所有事件都发生在 p = obj.pools行上。这表明对象引用导致了复制,而不是像预期的那样使用写时复制优化。或者它正在走对象图之类的东西。您的代码可能正在进行类似的操作。

    最好只是将其归因于解释器怪异,如果它使您的代码更快,则将其保留在其中,然后等待下一个版本中的修复。听起来值得作为错误报告提交给MathWorks。

    关于performance - Matlab的Get Property函数导致性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6905740/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com