Мне интересно о неизменных типах и выступлениях в Джулии.
-
В этом случае делает сложный тип неизменным улучшающим производительность? В документации указано
В некоторых случаях они более эффективны. Типы, подобные сложному примеру выше, могут быть эффективно упакованы в массивы, а в некоторых случаях компилятор может полностью исключить неизменяемые объекты.
Я не очень понимаю вторую часть.
-
Существуют ли случаи, когда стабильная производительность с сокращенными характеристиками составного типа (за исключением случая, когда поле должно быть изменено ссылкой)? Я думал, что один пример может быть, когда объект неизменяемого типа используется повторно как аргумент, так как
Объект с неизменяемым типом передается (как в операторах присваивания, так и в вызовах функций) путем копирования, тогда как изменяемый тип передается по ссылке.
Однако я не могу найти разницы в простом примере:
abstract MyType type MyType1 <: MyType v::Vector{Int} end immutable MyType2 <: MyType v::Vector{Int} end g(x::MyType) = sum(x.v) function f(x::MyType) a = zero(Int) for i in 1:10_000 a += g(x) end return a end x = fill(one(Int), 10_000) x1 = MyType1(x) @time f(x1) # elapsed time: 0.030698826 seconds (96 bytes allocated) x2 = MyType2(x) @time f(x2) # elapsed time: 0.031835494 seconds (96 bytes allocated)
Так почему же
f
медленнее с неизменяемым типом? Существуют ли случаи, когда использование неизменяемых типов делает код медленнее?