Tuesday, October 7, 2014

Making the HTTP server run 20% faster by using qrintf-gcc; a sprintf-optimizing preprocessor / compiler

tl;dr

This is an initial release announcement of qrintf, a preprocessor (and qrintf-gcc is the compiler frontend) that optimizes calls to sprintf and snprintf. C programs calling the functions may run faster by using the preprocessor / compiler in place of the standard compiler toolchain.

github.com/kazuho/qrintf

Background

sprintf (snprintf) is a great function for converting data to strings. The downside is that it is slow. Recently the functions have been one of the bottlenecks of H2O, which is a high performance HTTP server / library with support for HTTP/1.x and HTTP/2.

The function is slow not because stringification in general is a slow operation. It is slow mainly due to its design.

The function takes a format string (e.g. "my name is %s") and parse it at runtime, every time the function gets called. The design must have been a good choice when the C programming language was designed. Until the 1990s, every byte of memory was a precious resource. Using a memory-conscious approach (e.g. a state-machine for formatting strings) was a logical choice. But nowadays, the cost of memory is hundreds-of-thousand times cheaper than it used to be. On the other hand, the relative cost of running a state machine for building formatted strings has become large since it causes lots of branch mis-predictions that stall the CPU pipeline.

How it works

The understanding has led me to write qrintf, which works as a wrapper against the C preprocessor. It precompiles invocations of sprintf (and snprintf) with a constant format string (which is mostly the case) into optimized forms.

The example below illustrates the conversion performed by the qrintf preprocessor. As can be seen, the call to sprintf is precomplied into a series of function calls specialized for each portion of the format (and the C compiler may inline-expand the specialized calls). In the case of the example, the optimized code runs more than 10 times faster than the original form.
// source code
snprintf(
    buf,
    sizeof(buf),
    "%u.%u.%u.%u",
    sizeof(buf),
    (addr >> 24) & 0xff,
    (addr >> 16) & 0xff,
    (addr >> 8) & 0xff,
    addr & 0xff);

// after preprocessed by qrintf
_qrintf_chk_finalize(
    _qrintf_chk_u(
        _qrintf_chk_c(
            _qrintf_chk_u(
                _qrintf_chk_c(
                    _qrintf_chk_u(
                        _qrintf_chk_c(
                            _qrintf_chk_u(
                                _qrintf_chk_init(buf, sizeof(buf)),
                                (addr >> 24) & 0xff),
                            '.'),
                        (addr >> 16) & 0xff),
                    '.'),
                (addr >> 8) & 0xff),
            '.'),
        addr & 0xff));
$ gcc -Wall -O2 examples/ipv4addr.c && time ./a.out 1234567890
result: 73.150.2.210

real 0m2.475s
user 0m2.470s
sys 0m0.002s
$ qrintf-gcc -Wall -O2 examples/ipv4addr.c && time ./a.out 1234567890
result: 73.150.2.210

real 0m0.215s
user 0m0.211s
sys 0m0.002s

Performance impact on H2O

H2O uses sprintf in three parts: building the HTTP status line, building ETag, and building the access log.

By using qrintf-gcc in place of gcc, the performance of H2O jumps up by 20% in a benchmark that sends tiny files and with access logging enabled (from 82,900 reqs/sec. to 99,200 reqs/sec.).

The fact not only makes my happy (as the developer of qrintf and H2O) but also shows that optimizing sprintf at compile-time do have benefit for real world programs.

So if you are interested in using qrintf or H2O, please give it a try. Thank you for reading.

46 comments:

  1. Wow, looks great! Any plans to include your work in official GCC line?

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Credits that are offered with no pay evidence are known as no salary verification secured advances. Since these advances don't request any wage explanation to bolster the reimbursement ability of the borrower, guarantee is basic. cash advance

    ReplyDelete

  4. Thanks for sharing your info. I really appreciate your efforts and I will be waiting for your further write.
    Thanks for sharing !
    tanki online 2 | 2048 game online

    ReplyDelete
  5. I am wondering, is this related to sprintf family only or also for printf family? Because I saw some pretty amazing compile-time optimization there.

    ReplyDelete
  6. yes, seems printf is optimized:

    sprintf version:

    time ./a.out 1234567890
    result: 73.150.2.210

    real 0m2.557s
    user 0m2.556s
    sys 0m0.001s

    printf version:

    time ./a.out 1234567890 > /dev/null

    real 0m0.305s
    user 0m0.302s
    sys 0m0.003s

    ReplyDelete
  7. Commonly we attain confused when we finally hear the exact terms website development service in addition to internet developer getting used interchangeably. But thoughts is broken done looking over this, all your individual confusions may perhaps disappear. Poof!
    driving directions

    ReplyDelete
  8. It's been a pleasure for me to read such an informative article. I love reading good content and It's one of them. Moreover, your blog is loading really fast. Can I know which hosting platform are you using?
    New Year GIF Video

    ReplyDelete
  9. Wmtorrents
    Get serial keys and generators to activate and crack your softwares including Keygens. By mode of softwares you can activate any softwares
    https://wmtorrents.com/

    ReplyDelete
  10. Hey Thanks for sharing this valuable information with us. I will come back to your site and keep sharing this information with us.
    Best Regards - www.office.com/setup
    www.office.com/setup
    www.office.com/setup

    ReplyDelete
  11. Nice thoughts with great helping content. I have also been seeking such thoughfull content to learn and appy in the life. We have also created such type of content on our site. You can refer out site for more ideas.
    Happy New Year 2019 Wishes Messages Sms in Bengali
    Merry Christmas 2018 SMS, Wishes, Messages, Greetings in Bengali
    Merry Christmas 2018 Wishes Messages in Marathi,funny christmas text sms

    ReplyDelete
  12. Webroot.com/safe is a protection software solution that communicates with the cloud avoiding the hassle to manage the signature updates to deploy. for office setup visit office.com/setup

    ReplyDelete
  13. Nice thoughts with great helping content. I have also been seeking such thoughfull content to learn and appy in the life.

    pip camera new version 2019

    ReplyDelete
  14. Thanks for sharing nice information with us. i like your post and all you share with us is uptodate and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job. I found your blog using msn. This is an extremely well written article as www.jnews.in . I will be sure to bookmark it and return to read more of your useful information. Thanks for the post. I’ll certainly comeback.

    ReplyDelete
  15. I was impressed, I have to say. In fact, I rarely Encounter educational and funny blogs. You may strike a nail on your head. Your idea is wonderful. The problem is one of which is not speaking intellectually. I am pleased that 360result.inI am looking for one thing.

    ReplyDelete
  16. This article is actually a nice one it helps new internet viewers, who are wishing in favor of blogging. For more information click here latest news and I absolutely love your blog and find almost all of your post’s to be just what I’m looking for. Does one offer guest writers to write content to suit your needs? click here

    ReplyDelete
  17. Spot on with this write-up, I actually think this website needs far more attention. I’ll probably be back again to read more, thanks for the info!

    Happy Valentines Day Images 2019
    Happy Valentines Day Pictures Free Download
    Happy Valentines Day Clipart Free Download
    Happy Valentines Day Poems
    Happy Valentines Day Messages

    ReplyDelete
  18. I loved the article, keep updating interesting articles. I will be a regular reader… I am offering assignment help to students over the globe at a low price.

    https://www.studychat.in

    ReplyDelete
  19. This comment has been removed by the author.

    ReplyDelete
  20. This is certainly additionally an exceedingly wonderful offer everyone truly qualified on the lookout with. It's always not likely everyday there is chances read a little something. extremely well written article https://apsscresult2019.in . I will be sure to and return to read more of your useful information. Thanks for the post. I’ll certainly comeback

    ReplyDelete
  21. Thanks for sharing nice information with us. i like your post and all you share with us is uptodate and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job. I found your blog using msn. This is an extremely well written article as https://www.studyplans.in . I will be sure to bookmark it and return to read more of your useful information. Thanks for the post. I’ll certainly comeback.

    ReplyDelete
  22. Hi,
    Your article is very informative and has a lot of information. I really like your effort, keep posting.
    pip camera photo editor 2019

    ReplyDelete
  23. A very awesome blog post. We are really grateful for your blog post. You will find a lot of
    approaches after visiting your post.
    rrbgroupdresult-2019.in

    ReplyDelete
  24. Thanks for sharing nice information with us. i like your post and all you share with us is uptodate and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job. I found your blog using msn. This is an extremely well written article as studyplans.in . I will be sure to bookmark it and return to read more of your useful information. Thanks for the post. I’ll certainly comeback

    ReplyDelete
  25. I needed to thank you for this Incredible read !! apsscresult2019.in I unquestionably adored each and every line of it.

    ReplyDelete