Этот вопрос касается эффективности функций, написанных в виде расширений протокола в Swift 2.2. Кто-нибудь знает, как ускорить это время выполнения?
Предположим, что у меня есть протокол, число которого соответствует Int
protocol Number: Equatable, IntegerLiteralConvertible {
init(_ int: Int)
init(_ number: Self)
func +(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
}
extension Int: Number { }
Теперь я хочу написать факториальную функцию как расширение числа
extension Number {
func factorialNumber() -> Self {
if self == 0 { return 1 }
return self * (self - 1).factorialNumber()
}
}
Я также пишу ту же функцию, что и расширение Int
extension Int {
func factorialInt() -> Int {
if self == 0 { return 1 }
return self * (self - 1).factorialInt()
}
}
Когда я измеряю время выполнения каждой из этих функций, существует резкая разница.
Этот снимок экрана с включенной оптимизацией всего модуля.
Я бы предположил, что во время работы есть некоторые накладные расходы от дженериков. Есть лучший способ сделать это? Имеет ли смысл просто писать те же функции, что и расширения Int, Double, Float вместо того, чтобы пытаться написать одну функцию протокола.
Спасибо