From 8d81e59aa7a62652caf85f9c8db371703668c149 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 4 Jun 2019 19:58:39 +0900 Subject: 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 Co-authored-by: Yasuhiro MATSUMOTO --- benchmark/cgi_escape_html.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 benchmark/cgi_escape_html.yml (limited to 'benchmark/cgi_escape_html.yml') diff --git a/benchmark/cgi_escape_html.yml b/benchmark/cgi_escape_html.yml new file mode 100644 index 0000000000..af6abd08ac --- /dev/null +++ b/benchmark/cgi_escape_html.yml @@ -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 + +
+

Example Domain

+

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.

+

More information...

+
+ + HTML + script: CGI.escapeHTML(str) + loop_count: 1000000 -- cgit v1.2.3