Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MATLAB的最佳替代品';s全局变量_Performance_Matlab_Global Variables - Fatal编程技术网

Performance MATLAB的最佳替代品';s全局变量

Performance MATLAB的最佳替代品';s全局变量,performance,matlab,global-variables,Performance,Matlab,Global Variables,我正在编写一个应用程序,它有许多函数分布在不同的文件中。我有一个logger,它是一个带有函数指针的结构,我使用它来记录信息以供用户查看(即,当前正在执行的函数、计算结果等)。我之所以使用struct作为记录器,而不仅仅是fprintf(),是因为将来我可以很容易地用XML记录器、HTML记录器等替代它 由于我的代码由许多相互调用的函数组成,因此我将logger结构声明为全局结构,因此不必将其传递给所有函数。然而,无论我在哪里看到,全局变量在MATLAB中都是邪恶的化身,这将大大降低我的程序速度

我正在编写一个应用程序,它有许多函数分布在不同的文件中。我有一个logger,它是一个带有函数指针的结构,我使用它来记录信息以供用户查看(即,当前正在执行的函数、计算结果等)。我之所以使用struct作为记录器,而不仅仅是
fprintf()
,是因为将来我可以很容易地用XML记录器、HTML记录器等替代它

由于我的代码由许多相互调用的函数组成,因此我将logger结构声明为全局结构,因此不必将其传递给所有函数。然而,无论我在哪里看到,全局变量在MATLAB中都是邪恶的化身,这将大大降低我的程序速度


有没有一种方法可以使变量在文件中可用,而不必将其作为输入参数传递,也不会受到严重的性能损失?

您还可以在文件中使用persistent关键字,并在其中分配记录器。
它在某些方面与C++中的“强>静态<强”关键字相似。它也是单例模式的实现

function CallLogger(st)
    persistent logger;
    if isempty(logger)
        %Allocate new logger
    end
    logger.disp(st);
end
它比global更好,因为
1.在你不知情的情况下,任何人都无法摧毁你的记录器。
2.甚至没有人知道这个对象,因为它仅限于函数范围


顺便说一下,我不同意global存在性能问题。就软件工程而言,这不是一个好的实践。

比在函数中调用持久变量(例如,如果保存并重新加载工作区,则不会保存持久变量)更好的做法是从函数+结构移动到对象:即,你应该研究一下MATLAB的面向对象编程。

全局变量不是“邪恶的”。如果你不是一个有经验的程序员,它们可能会产生很多错误,比如重载其他变量等等。另外,我不相信在Matlab中globals的性能会受到影响。如果使用globals让你的生活“非常”简单,那么就使用它们。“不要让它成为一种习惯。”Jorge说,任何程序员,不仅仅是没有经验的程序员。但除此之外,是的。@Jorge-你使用全局变量和将变量传递给方法的标准是什么?你可以看看如何使用全局变量。我只在制作GUI时使用过它,但它在其他环境中可能也很有用。嗨@Andrey,在我看来,持久变量相当于C/C++中的“静态”变量,所以它们只存在于函数范围内,而不存在于函数之间,对吧?谢谢Andrey,你的回答很好。我决定尽我所能远离环球足球队,因为我有良好的练习和表现。谢谢您是指创建一个继承MatlabHandle类的新类吗?