I like fortran array-slicing notation ( array(1:n) ), but I am wondering if I can get a performance hit if I use them when it is not needed.
Consider, for example, this simple quick-sort code (it works, but it is obvious that it does not care about choosing a good core):
recursive subroutine quicksort(array, size) real, dimension(:), intent(inout) :: array integer, intent(in) :: size integer :: p if (size > 1) then p = partition(array, size, 1) call quicksort(array(1:p-1), p-1) call quicksort(array(p+1:size), size-p) end if end subroutine quicksort function partition(array, size, pivotdex) result(p) real, dimension(:), intent(inout) :: array integer, intent(in) :: size, pivotdex real :: pivot integer :: i, p pivot = array(pivotdex) call swap(array(pivotdex), array(size)) p=1 do i=1,size-1 if (array(i) < pivot) then call swap(array(i), array(p)) p=p+1 end if end do call swap(array(p), array(size)) end function partition subroutine swap(a, b) real, intent(inout) :: a, b real :: temp temp = a a = b b = temp end subroutine swap
I could just pass the whole array along with the indices in which the recursive parts should work, but I like the code this way. However, when I call quicksort(array(1:p-1), p-1) , does it make it a temporary array, or does it just create a shallow link structure or something like that? Is this a reasonably effective solution?
This question is related, but it looks like it creates temporary arrays due to alternating fragments and explicit dimensional variables, so I'm safe from this, right?
fortran slice fortran90
krs013
source share