出于样式和性能方面的考虑,我发现自己比较了以下两个功能。在以下两种向数组中的每个元素加1的方法之间是否可以获得等效的性能?
public function setupMetaBox() {
if( isset($_POST['taxonomy']) ) {
...
require_once('admin\metabox\TermMetaBox.php');
$this->metaBox = new TermMetabox( $_POST['taxonomy'] );
...
}
}
对编译器优化不了解太多,在我看来function inplaceadd1!(ar)
ar .= ar .+ 1.
end
function add1(ar)
return(ar .+ 1.)
end
function inplace!(ar)
ar .= add1(ar)
end
ar1 = rand(10000)
ar2 = ar1[:]
@time inplaceadd1!(ar2)
#0.000010 seconds (4 allocations: 160 bytes)
@time inplace!(ar1)
#0.000026 seconds (6 allocations: 78.359 KiB)
可以内联到add1
中,并且可以合并循环以实现相同的性能而无需额外的分配。会不会发生?
欣赏见解和任何建议。
答案 0 :(得分:1)
在您的情况下不会发生。 add1
通常会返回一个新数组,并且编译器根本无法弄清这个新数组。请注意,!
用于样式目的,目前对编译器没有任何特殊意义。
您应该改为按元素编写函数,并让loop fusion进行工作。如果要定义按元素的操作,这是更朱莉娅的方式。
function inplaceadd1!(ar)
ar .= ar .+ 1.
end
function add1(a)
a + 1. # no `.+` here
end
function inplace!(ar)
ar .= add1.(ar)
end
由于它是一个小函数,因此应该由编译器自动内联。您还可以使用@inline
宏(使用@inline
注释函数)向编译器提示。
@btime inplaceadd1!($ar2)
# 1.198 μs (0 allocations: 0 bytes)
@btime inplace!($ar1)
# 1.155 μs (0 allocations: 0 bytes)