Какова практическая разница между общими и протокольными параметрами функций?

Дан протокол без каких-либо связанных типов:

protocol SomeProtocol
{
    var someProperty: Int { get }
}

В чем разница между этими двумя функциями на практике (имеется в виду не «одна является общей, а другая нет»)? Они генерируют другой код, имеют ли они разные характеристики времени выполнения? Меняются ли эти различия, когда протокол или функции становятся нетривиальными? (поскольку компилятор, вероятно, может встроить что-то вроде этого)

func generic<T: SomeProtocol>(some: T) -> Int
{
    return some.someProperty
}

func nonGeneric(some: SomeProtocol) -> Int
{
    return some.someProperty
}

Я в основном спрашиваю о различиях в том, что делает компилятор, я понимаю последствия обоих языков. В основном, делаетnonGeneric подразумевает постоянный размер кода, но более медленную динамическую диспетчеризацию, по сравнению сgeneric используя растущий размер кода для каждого типа, но с быстрой статической диспетчеризацией?

Ответы на вопрос(2)

Ваш ответ на вопрос