以下是提高Octave程序执行速度的其他一些方法。
a = zeros (1000); # create a 1000x1000 matrix b = a; # no copying done here b(1) = 1; # copying done here
惰性复制适用于整个Octave对象,如矩阵、数组、结构体,以及单个数组或结构体元素(而不是数组)。
此外,当Octave能够确定索引部分在内存中是连续的时,索引表达式也使用延迟复制。例如
a = zeros (1000); # create a 1000x1000 matrix b = a(:,10:100); # no copying done here b = a(10:100,:); # copying done here
这适用于数组(矩阵)、元胞数组和索引的结构体()’. 在某些情况下,生成逗号分隔列表的索引表达式也可以从浅复制中受益。特别是,当a是astruct数组,表达式如下{a.x}, {a(:,2).x}
将使用lazycoping,以便在结构体数组和元胞数组之间共享数据。
大多数索引表达式的生存时间都不会超过其父对象。然而,在极少数情况下,延迟复制的切片会比其父切片更持久,在这种情况下,它会成为孤儿,仍然占用不必要的内存。为了在大多数实际情况下提供补救措施,当avalue存储到“永久”位置(如命名变量orcell或struct元素)时,Octave会在某些情况下检查孤立的懒惰切片,并可能节约它们。例如
a = zeros (1000); # create a 1000x1000 matrix b = a(:,10:100); # lazy slice a = []; # the original "a" array is still allocated c{1} = b; # b is reallocated at this point
result = zeros (big_n, big_m) for i = over:and_over ridx = ... cidx = ... result(ridx, cidx) = new_value (); endfor
而不是
result = []; for i = ever:and_ever result = [ result, new_value() ]; endfor
有时项目的数量无法提前计算,需要进行类似堆栈的操作。当元素被重复插入或从数组末尾移除时,Octave会将其检测为堆栈,并尝试通过将数组重新赋值到更大的块中来使用更智能的内存管理策略。此策略也适用于单元和结构体数组。
a = []; while (condition) ... a(end+1) = value; # "push" operation ... a(end) = []; # "pop" operation ... endwhile
eval
或feval
过度地。分析输入或在符号表中查找函数名称是相对昂贵的操作。如果您正在使用eval
仅仅作为一种异常处理机制,而不是因为需要执行一些任意文本,请使用try
语句。详见try语句.
ignore_function_time_stamp
在适当的时候。如果您正在调用许多函数,而在运行过程中没有一个函数需要更改,请设置变量ignore_function_time_stamp
到"all"
。这将阻止Octave在程序运行时检查函数文件的时间戳,以查看它是否已更新。版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2