[swift-server-dev] Existential - Thoughts on the current HTTP API

Helge Heß me at helgehess.eu
Fri Oct 13 07:07:42 CDT 2017

It is a little off-topic, but since you brought it up in here ;-) Thinking about the existential:

On 13. Oct 2017, at 12:39, Helge Heß via swift-server-dev <swift-server-dev at swift.org> wrote:
>> `UnsafeHTTPResponseBody` is an existential (a protocol-typed variable). That means with this type signature, you'll do an allocation for every call, that's pretty bad.

Is that intended or a compiler bug? My assumption for passing something as a protocol would be that

 writeBody(_ data: UnsafeHTTPResponseBody)

Essentially becomes something like

 writeBody(_ dataOwner: Any, _ data: vtable<UnsafeHTTPResponseBody>)
 writeBody(myImp, myImp.vtableForProtocol<UnsafeHTTPResponseBody>)

You are saying that it is more like this?:

 struct existential {
   let dataOwner : Any
   let data      : vtable<UnsafeHTTPResponseBody>
 let e = malloc(existential)

That sounds a little crazy, doesn’t it? :-)

>> A better option would be
>> `func writeBody<Body: UnsafeHTTPResponseBody>(_ data: Body, …)`

But this is only better if the concrete `Body` type lives in the same module like the `writeBody` function, right? (so that WMO optimisation can kick in and inline the instantiation of the generic type?)

In the HTTP module case `Body` would be in a different module and in my understanding would always use some dynamic ‘generics’ dispatcher? Which is slow? Is that really faster than a protocol type?


More information about the swift-server-dev mailing list