копировать! и нарезка в Юлии - PullRequest
3 голосов
/ 26 апреля 2020

Я реализовал сортировку слиянием в Julia в качестве упражнения и заметил, что есть небольшая разница в производительности и распределении памяти, когда я использую copy! и традиционное присвоение значения с помощью sling (бит комментария ). Может кто-нибудь объяснить, из-за чего эта разница?

Моя функция слияния в 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 Ответ

3 голосов
/ 26 апреля 2020

Конечно. right[r:end] выделяет, потому что срез создает копию. Вместо этого вы можете использовать представление:

result[i+1:end] .= @view right[r:end]

Говоря с точки зрения микрооптимизации, copy! (вы на самом деле имели в виду copyto!, кстати?) Все еще может быть немного лучше, поскольку создание представления работает в постоянном времени / пространстве, тем не менее, есть небольшие накладные расходы, которые не могут быть исключены.

...