hescape 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8582fcf14d0eddac5df90d5bf8463c85e32e277b
4
- data.tar.gz: 6ace6ba41e38ec0b154caca8f7d05f82833bfbf6
2
+ SHA256:
3
+ metadata.gz: d9ee8060d3f4a049a27ea234820dc709212b3bc7fc65eb9ec68cb16d8916d9c1
4
+ data.tar.gz: aed8550ea57d0a43a701c5c9d016d1f7104173aeb5d0dbbdb6c0480262bd9577
5
5
  SHA512:
6
- metadata.gz: 048d1fbe3fb8559035577e9ccdb8bb60c9d08ba907494a53f455dde6bf79dc98a4e5e699f4118c2ea5e49690908f0aacf2949bda39ca45e0fc8d3ecc0312154e
7
- data.tar.gz: b3c16e9a04736b0b3f023e7029684485789ccb9722e383e31edf6899709f4604e179a30e152179494aade4aebcf0e60789be9071690eb3b07d0ad975cf5712eb
6
+ metadata.gz: 65978b80e047b7a59eec90463e153e4d2e9526d3b972be5231f5d02a2606b83e413ce0dc7bc81c825e3483847d833b3ae1d97cad58248e63d10802366ece009c
7
+ data.tar.gz: 41f9109130c0e0e1211f587b2e54a2d2167c9b84ddbc56bff38b3a46e76fc400e045bbc2836525b5b7a4416eb92521f159b8c33b9aadc9b857267e740c76ef72
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/README.md CHANGED
@@ -2,6 +2,76 @@
2
2
 
3
3
  A gem to use [hescape](https://github.com/k0kubun/hescape) from Ruby, which is fast HTML escape implementation using SSE instructions.
4
4
 
5
+ ## Benchmark
6
+
7
+ See [the result](https://app.wercker.com/k0kubun/hescape-ruby/runs/build/57b09e1de8960a01001b3811) of [this benchmark](https://github.com/k0kubun/hescape-ruby/blob/v0.1.0/benchmark/benchmark.rb). Followings are the result of:
8
+
9
+ ```ruby
10
+ Benchmark.ips do |x|
11
+ str = ENV['ESCAPE_STRING']
12
+ puts "escaping: #{str}"
13
+
14
+ escape_table = { "'" => '&#39;', '&' => '&amp;', '"' => '&quot;', '<' => '&lt;', '>' => '&gt;', }
15
+
16
+ x.report('gsub') { str.gsub(/['&\"<>]/, escape_table) }
17
+ x.report('escape_utils') { EscapeUtils.escape_html(str, false) }
18
+ x.report('cgi/escape') { CGI.escapeHTML(str) }
19
+ x.report('hescape') { Hescape.escape_html(str) }
20
+ x.compare!
21
+ end
22
+ ```
23
+
24
+ ### No escape
25
+ ```
26
+ escaping: https://github.com/k0kubun/hescape-ruby
27
+ Calculating -------------------------------------
28
+ gsub 2.392M (± 1.0%) i/s - 11.983M in 5.010225s
29
+ escape_utils 2.365M (± 0.3%) i/s - 11.896M in 5.031031s
30
+ cgi/escape 3.787M (± 8.0%) i/s - 18.965M in 5.037529s
31
+ hescape 7.515M (± 0.3%) i/s - 37.736M in 5.021293s
32
+
33
+ Comparison:
34
+ hescape: 7515215.8 i/s
35
+ cgi/escape: 3787425.3 i/s - 1.98x slower
36
+ gsub: 2391950.1 i/s - 3.14x slower
37
+ escape_utils: 2364604.2 i/s - 3.18x slower
38
+ ```
39
+
40
+ ### Short escape
41
+ Note: If given string is short, hescape skips SSE instruction. But it's fast.
42
+
43
+ ```
44
+ escaping: <script />
45
+ Calculating -------------------------------------
46
+ gsub 586.604k (± 1.8%) i/s - 2.941M in 5.015840s
47
+ escape_utils 2.948M (± 0.3%) i/s - 14.781M in 5.014237s
48
+ cgi/escape 2.646M (± 1.7%) i/s - 13.226M in 5.000218s
49
+ hescape 3.731M (± 0.3%) i/s - 18.661M in 5.001429s
50
+
51
+ Comparison:
52
+ hescape: 3731246.4 i/s
53
+ escape_utils: 2947868.9 i/s - 1.27x slower
54
+ cgi/escape: 2645937.6 i/s - 1.41x slower
55
+ gsub: 586604.3 i/s - 6.36x slower
56
+ ```
57
+
58
+ ### Long escape
59
+
60
+ ```
61
+ escaping: <<<<<<<<<<>>>>>>>>>&&&&&&&&&&""""""'''''
62
+ Calculating -------------------------------------
63
+ gsub 66.181k (± 0.4%) i/s - 331.968k in 5.016150s
64
+ escape_utils 749.600k (± 8.1%) i/s - 3.762M in 5.053210s
65
+ cgi/escape 720.474k (± 1.6%) i/s - 3.628M in 5.037395s
66
+ hescape 754.412k (± 8.2%) i/s - 3.801M in 5.070904s
67
+
68
+ Comparison:
69
+ hescape: 754411.6 i/s
70
+ escape_utils: 749600.4 i/s - same-ish: difference falls within error
71
+ cgi/escape: 720473.5 i/s - same-ish: difference falls within error
72
+ gsub: 66181.0 i/s - 11.40x slower
73
+ ```
74
+
5
75
  ## Installation
6
76
 
7
77
  Add this line to your application's Gemfile:
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/extensiontask"
3
+ require "rspec/core/rake_task"
3
4
 
4
5
  task :build => :compile
5
6
 
@@ -8,3 +9,13 @@ Rake::ExtensionTask.new("hescape") do |ext|
8
9
  end
9
10
 
10
11
  task :default => [:clobber, :compile, :spec]
12
+
13
+ begin
14
+ require "rspec/core/rake_task"
15
+
16
+ RSpec::Core::RakeTask.new(:spec)
17
+
18
+ task :spec => :build
19
+ rescue LoadError
20
+ # no rspec available
21
+ end
@@ -98,17 +98,18 @@ find_escape_fast(const char *buf, size_t i, size_t size, int *found)
98
98
  __m128i escapes5 = _mm_loadu_si128((const __m128i *)escapes);
99
99
  size_t left = (size - i) & ~15;
100
100
  do {
101
- __m128i b16 = _mm_loadu_si128((void *)buf);
101
+ __m128i b16 = _mm_loadu_si128((void *)(buf + i));
102
102
  int index = _mm_cmpestri(escapes5, 5, b16, 16, _SIDD_CMP_EQUAL_ANY);
103
103
  if (unlikely(index != 16)) {
104
104
  i += index;
105
105
  *found = 1;
106
- break;
106
+ return i;
107
107
  }
108
108
  i += 16;
109
109
  left -= 16;
110
110
  } while(likely(left != 0));
111
111
  }
112
+ *found = 0;
112
113
  return i;
113
114
  }
114
115
  #endif
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "escape_utils"
26
26
  spec.add_development_dependency "rake", "~> 10.0"
27
27
  spec.add_development_dependency "rake-compiler"
28
+ spec.add_development_dependency "rspec", "~> 3.5"
28
29
  end
@@ -1,3 +1,3 @@
1
1
  module Hescape
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -5,6 +5,9 @@ build:
5
5
  - script:
6
6
  name: compile
7
7
  code: bundle exec rake compile
8
+ - script:
9
+ name: spec
10
+ code: bundle exec rake spec
8
11
  - script:
9
12
  name: "[bench] no escape"
10
13
  code: ESCAPE_STRING="https://github.com/k0kubun/hescape-ruby" bundle exec ruby benchmark/benchmark.rb
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hescape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-14 00:00:00.000000000 Z
11
+ date: 2019-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.5'
83
97
  description: Fast HTML escape utility
84
98
  email:
85
99
  - takashikkbn@gmail.com
@@ -89,6 +103,7 @@ extensions:
89
103
  extra_rdoc_files: []
90
104
  files:
91
105
  - ".gitignore"
106
+ - ".rspec"
92
107
  - Gemfile
93
108
  - LICENSE.txt
94
109
  - README.md
@@ -123,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
138
  version: '0'
124
139
  requirements: []
125
140
  rubyforge_project:
126
- rubygems_version: 2.5.1
141
+ rubygems_version: 2.7.6
127
142
  signing_key:
128
143
  specification_version: 4
129
144
  summary: Fast HTML escape utility