Julia中的复制和切片

4
我正在使用Julia实现归并排序作为练习,并注意到在使用 copy! 和传统的切片赋值(已注释部分)时,性能和内存分配略有差异。 有人可以解释一下这种差异的根源吗?
我的合并函数在MergeSort中
function myMerge(left, right)
    l = 1
    r = 1
    k = length(left) + length(right)
    result = zeros(k)
    for i in 1:k
        if left[l] <= right[r]
            result[i] = left[l]
            l += 1
            if l > length(left)
                #result[i+1:end] = right[r:end] # <-------- this is slower and uses more memory
                copy!(result, i+1, right, r)  # <-------- this is faster
                return result
            end
        else
            result[i] = right[r]
            r += 1
            if r > length(right)
                #result[i+1:end] = left[l:end]# <-------- this is slower and uses more memory 
                copy!(result, i+1, left, l)  #   <-------- this is faster
                return result
            end
        end
    end
    return result
end
1个回答

4
当然。 right[r:end]是在分配内存,因为切片会创建一个副本。您可以使用视图来代替:
result[i+1:end] .= @view right[r:end]

从微观优化的角度来看,copy!(你实际上是不是想说copyto!)仍然可以更好一些,因为虽然创建视图在恒定的时间/空间内运行,但仍然存在一些小开销可能无法消除。


1
编译器有时会省略视图的分配,如果它能证明它们不会逃逸当前上下文。如果不能,则它们通常出现为许多小分配。在性能敏感的代码中,消除它们实际上可以显著提高性能。 - Fredrik Bagge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接