Julia에서 슬라이싱은 복사를 해요. 알고 있었는데 루프 안에서는 깜빡했어요. 행렬의 열을 돌면서 j마다 s += sum(A[:, j])를 하는 함수를 예로 들어 볼게요. A[:, j]가 매번 새 벡터를 만들고, 더하고, 버려요. @time을 보니 할당이 열 개수에 따라 늘어났고, 성능 팁 문서는 예상 못 한 할당을 거의 언제나 문제의 신호라고 해요.
view(A, :, j)를 쓰거나 루프 앞에 @views를 붙이면 슬라이스가 A를 가리키는 SubArray가 되고 복사가 사라져요.
궁금해진 건 @views가 또 뭘 바꾸느냐예요. 감싼 식 안의 모든 슬라이스를 뷰로 바꾸는데, 대입 오른쪽에 있는 것도 포함이에요. 그래서 @views 블록 안의 x = A[:, j]는 뷰가 되고, 나중에 x에 쓰면 A에 써져요. 알고 보면 전혀 이상하지 않아요. 그런데 루프 하나 고치려고 함수 전체에 @views를 붙였는데, 그 함수가 아래쪽 어딘가에서 일부러 열을 복사하고 있었다면 놓치기 쉬워요.