Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Performance Comparison of Swift http-parser port

Source Repository is:

Swift port was branched of C http-parser Version 2.6.0, git hash:


Swift port version this started from:


Port Specific Notes

The port has NOT been optimized for speed at all.

  • macros have been replaced with func's
    • so the compiler has to be smart to inline them
    • the C macros have been accessing local state, to simulate that I used nested functions
  • the big goto loop has been replaced with a step function,
  • there are a few dispatch tables which are converted straight to Swift arrays, such are range-checked etc
  • callbacks are done using regular Swift closures

Ideas to get the Swift faster

Instruments says that almost all the time is lost in ARC.

  • the dispatch tables are stored in global-let's, does this always have a dispatch_once overhead?
    • the parser might need to grab a copy of the pointer on startup or execute, but the macros would need to move into the parser.
  • the callback closure invocations are pretty slow, we may be able to convert such to convention(c) closures
    • Update: this does not seem to be possible at the moment as Swift structs can't be marked as convention(c) (hence the callbacks can't be either)
      • there is an unofficial convention(thin), but that is too easy to crash
      • we may be forced to switch to a delegate protocol to get appropriate performance
  • would unwrapping the nested funcs have any perf advantage?


Bottom line so far:

  • C version is very fast (>20m requests per sec)
  • Swift 2.3 is 3x slower than C, but 6.5x faster than Swift 3p4
  • Swift 3p4 is really slow, maybe debug code related?

Obviously I may have made mistakes, as before :-)

2016-08-08 master

MacPro 3.7 GHz Quad-Core Intel Xeon E5

C Version - Release Build (2016-08-08):

[0] time: 93ms
[1] time: 93ms
[2] time: 96ms
[3] time: 95ms
[4] time: 94ms
Total: 471ms COUNT: 10002000

Swift 2.3 (2016-08-08) - Release Build, safety checks off

struct vtable:
[0] time: 311ms
[1] time: 306ms
[2] time: 308ms
[3] time: 305ms
[4] time: 308ms
Total: 1538ms COUNT: 10002000
protocol with closures:
[0] time: 1919ms
[1] time: 1953ms
[2] time: 1934ms
[3] time: 1916ms
[4] time: 1932ms
Total: 9654ms COUNT: 20004000

Swift 3 Preview 4 (2016-08-08) - Release Build, safety checks off

struct vtable:
[0] time: 2021ms
[1] time: 2017ms
[2] time: 2027ms
[3] time: 2020ms
[4] time: 2021ms
Total: 10106ms COUNT: 10002000
protocol with closures:
[0] time: 3865ms
[1] time: 3873ms
[2] time: 3905ms
[3] time: 3875ms
[4] time: 3880ms
Total: 19398ms COUNT: 20004000

Instruments Says

  • lots of ARC killing perf
    • TODO: check with latest w/o closures

struct-parser branch

  • this is in master now

lookup-tables branch

  • this is in master now

always-inline branch

  • this is in master now


Test performance of http-parser in Swift and C






No packages published