性能成本:跨功能障碍没有环路融合

时间:2018-11-05 03:33:17

标签: julia

出于样式和性能方面的考虑,我发现自己比较了以下两个功能。在以下两种向数组中的每个元素加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中,并且可以合并循环以实现相同的性能而无需额外的分配。会不会发生?

欣赏见解和任何建议。

1 个答案:

答案 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)