1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Optimize CGI.escapeHTML by reducing buffer extension

and switch-case branches.

Buffer allocation optimization using `ALLOCA_N` would be the main
benefit of patch. It eliminates the O(N) buffer extensions.

It also reduces the number of branches using escape table like
https://mattn.kaoriya.net/software/lang/c/20160817011915.htm.

Closes: https://github.com/ruby/ruby/pull/2226

Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: Yasuhiro MATSUMOTO <mattn.jp@gmail.com>
This commit is contained in:
Takashi Kokubun 2019-06-04 19:58:39 +09:00
parent b31e1b4a7c
commit 8d81e59aa7
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
2 changed files with 72 additions and 48 deletions

View file

@ -0,0 +1,40 @@
prelude: require 'cgi/escape'
benchmark:
- name: escape_html_blank
prelude: str = ""
script: CGI.escapeHTML(str)
loop_count: 20000000
- name: escape_html_short_none
prelude: str = "abcde"
script: CGI.escapeHTML(str)
loop_count: 20000000
- name: escape_html_short_one
prelude: str = "abcd<"
script: CGI.escapeHTML(str)
loop_count: 20000000
- name: escape_html_short_all
prelude: str = "'&\"<>"
script: CGI.escapeHTML(str)
loop_count: 5000000
- name: escape_html_long_none
prelude: str = "abcde" * 300
script: CGI.escapeHTML(str)
loop_count: 1000000
- name: escape_html_long_all
prelude: str = "'&\"<>" * 10
script: CGI.escapeHTML(str)
loop_count: 1000000
- name: escape_html_real
prelude: | # http://example.com/
str = <<~HTML
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
HTML
script: CGI.escapeHTML(str)
loop_count: 1000000