leptris 1.6.0 → 1.6.2
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 +4 -4
- data/CHANGELOG.md +70 -0
- data/CLAUDE.md +76 -87
- data/README.adoc +80 -6
- data/Rakefile +1 -1
- data/benchmark/README.md +8 -164
- data/lib/leptris/version.rb +1 -1
- data/lib/leptris/xml/cdata.rb +1 -0
- data/lib/leptris/xml/comment.rb +1 -0
- data/lib/leptris/xml/document.rb +29 -14
- data/lib/leptris/xml/element.rb +21 -3
- data/lib/leptris/xml/ffi.rb +3 -13
- data/lib/leptris/xml/node.rb +32 -10
- data/lib/leptris/xml/node_set.rb +6 -5
- data/lib/leptris/xml/processing_instruction.rb +2 -0
- data/lib/leptris/xml/searchable.rb +1 -1
- data/lib/leptris/xml/serialization.rb +20 -2
- data/lib/leptris/xml/text.rb +1 -0
- data/lib/leptris/xml.rb +3 -2
- metadata +1 -36
- data/TODO.impl/01-architecture.md +0 -217
- data/TODO.impl/02-ffi-declarations.md +0 -236
- data/TODO.impl/03-document-node-element-nodeset.md +0 -382
- data/TODO.impl/04-sax-parser.md +0 -203
- data/TODO.impl/05-serialize-c14n-memory-specs-css.md +0 -276
- data/docs/ARCHITECTURE.adoc +0 -559
- data/docs/BUILD.md +0 -395
- data/docs/ERROR_MESSAGES.md +0 -458
- data/docs/FFI_ARCHITECTURE.md +0 -439
- data/docs/FUTURE_VISION.md +0 -303
- data/docs/GITHUB_ACTIONS.md +0 -293
- data/docs/OPTIMIZATIONS_IMPLEMENTED.adoc +0 -459
- data/docs/PERFORMANCE.adoc +0 -668
- data/docs/PERFORMANCE.md +0 -448
- data/docs/RELEASE_NOTES_v1.0.0.md +0 -515
- data/docs/XPATH_SPEC_COMPLIANCE.md +0 -298
- data/docs/completion/leptris.bash +0 -86
- data/docs/completion/leptris.zsh +0 -74
- data/docs/man/leptris-format.1 +0 -227
- data/docs/man/leptris-parse.1 +0 -178
- data/docs/man/leptris-xpath.1 +0 -312
- data/docs/man/leptris.1 +0 -160
- data/docs/v0.9.0_PERFORMANCE_IMPROVEMENTS.md +0 -217
- data/docs/v0.9.0_RELEASE_SUMMARY.md +0 -281
- data/docs/v1.0.0_CONTINUATION_PLAN.md +0 -172
- data/docs/v1.0.0_CONTINUATION_PROMPT.md +0 -382
- data/docs/v1.0.0_SESSION_6_CONTINUATION.md +0 -434
- data/docs/v1.0.0_SESSION_6_PROMPT.md +0 -231
- data/docs/v1.0.0_STATUS_TRACKER.md +0 -224
- data/docs/v1.1.0_CONTINUATION_PLAN.md +0 -299
- data/docs/v1.1.0_FINAL_CONTINUATION_PLAN.md +0 -201
- data/docs/v1.1.0_SESSION_3_PROMPT.md +0 -223
- data/docs/v1.1.0_STATUS_TRACKER.md +0 -355
- data/docs/xml-performance.adoc +0 -115
- data/docs/xpath-performance.adoc +0 -379
data/docs/xpath-performance.adoc
DELETED
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
= XPath Performance Benchmarks
|
|
2
|
-
:toc:
|
|
3
|
-
:toclevels: 3
|
|
4
|
-
|
|
5
|
-
== Overview
|
|
6
|
-
|
|
7
|
-
This document provides comprehensive performance benchmarks, generated from actual benchmark runs using `benchmark-ips`.
|
|
8
|
-
|
|
9
|
-
**IMPORTANT**: This file is auto-generated from benchmark data. Do not edit manually.
|
|
10
|
-
To update, run the appropriate rake task (see footer).
|
|
11
|
-
|
|
12
|
-
== Test Environment
|
|
13
|
-
|
|
14
|
-
* **Ruby Version**: 3.1.1
|
|
15
|
-
* **Platform**: arm64-darwin21
|
|
16
|
-
* **Leptris Version**: 0.1.0
|
|
17
|
-
* **Libraries Available**:
|
|
18
|
-
* **Nokogiri**: Available
|
|
19
|
-
* **Timestamp**: 2025-11-27T18:27:43+0800
|
|
20
|
-
* **Method**: benchmark-ips
|
|
21
|
-
|
|
22
|
-
== Performance Summary
|
|
23
|
-
|
|
24
|
-
**Overall Results** (50 tests, vs Nokogiri):
|
|
25
|
-
|
|
26
|
-
* **Average**: 2.34× slower
|
|
27
|
-
* **Best case**: 3.13× faster
|
|
28
|
-
* **Worst case**: 10.38× slower
|
|
29
|
-
* **Tests faster**: 2/50 (4.0%)
|
|
30
|
-
* **Tests slower**: 48/50 (96.0%)
|
|
31
|
-
|
|
32
|
-
**Verdict**: ❌ **Needs Optimization** - Significantly slower than Nokogiri
|
|
33
|
-
|
|
34
|
-
== axes
|
|
35
|
-
|
|
36
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
37
|
-
|===
|
|
38
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
39
|
-
|
|
40
|
-
|Child
|
|
41
|
-
|1.39µs
|
|
42
|
-
|4.3µs
|
|
43
|
-
|**3.09× faster** ✅
|
|
44
|
-
|
|
45
|
-
|Descendant
|
|
46
|
-
|59.56µs
|
|
47
|
-
|5.74µs
|
|
48
|
-
|**10.38× slower** ❌
|
|
49
|
-
|
|
50
|
-
|Descendant Or Self
|
|
51
|
-
|17.69µs
|
|
52
|
-
|6.49µs
|
|
53
|
-
|**2.73× slower** ❌
|
|
54
|
-
|
|
55
|
-
|Parent
|
|
56
|
-
|11.5µs
|
|
57
|
-
|4.27µs
|
|
58
|
-
|**2.69× slower** ❌
|
|
59
|
-
|
|
60
|
-
|Ancestor
|
|
61
|
-
|12.5µs
|
|
62
|
-
|4.3µs
|
|
63
|
-
|**2.91× slower** ❌
|
|
64
|
-
|
|
65
|
-
|Ancestor Or Self
|
|
66
|
-
|12.72µs
|
|
67
|
-
|4.36µs
|
|
68
|
-
|**2.92× slower** ❌
|
|
69
|
-
|
|
70
|
-
|Self
|
|
71
|
-
|11.5µs
|
|
72
|
-
|7.53µs
|
|
73
|
-
|**1.53× slower** ❌
|
|
74
|
-
|
|
75
|
-
|Following Sibling
|
|
76
|
-
|11.83µs
|
|
77
|
-
|6.89µs
|
|
78
|
-
|**1.72× slower** ❌
|
|
79
|
-
|
|
80
|
-
|Preceding Sibling
|
|
81
|
-
|11.37µs
|
|
82
|
-
|5.52µs
|
|
83
|
-
|**2.06× slower** ❌
|
|
84
|
-
|
|
85
|
-
|Following
|
|
86
|
-
|17.99µs
|
|
87
|
-
|12.94µs
|
|
88
|
-
|**1.39× slower** ❌
|
|
89
|
-
|
|
90
|
-
|Preceding
|
|
91
|
-
|12.91µs
|
|
92
|
-
|5.3µs
|
|
93
|
-
|**2.44× slower** ❌
|
|
94
|
-
|
|
95
|
-
|Attribute
|
|
96
|
-
|11.29µs
|
|
97
|
-
|5.08µs
|
|
98
|
-
|**2.22× slower** ❌
|
|
99
|
-
|
|
100
|
-
|Namespace
|
|
101
|
-
|14.79µs
|
|
102
|
-
|7.71µs
|
|
103
|
-
|**1.92× slower** ❌
|
|
104
|
-
|
|
105
|
-
|===
|
|
106
|
-
|
|
107
|
-
== simple_paths
|
|
108
|
-
|
|
109
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
110
|
-
|===
|
|
111
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
112
|
-
|
|
113
|
-
|Absolute Path
|
|
114
|
-
|6.01µs
|
|
115
|
-
|4.99µs
|
|
116
|
-
|**1.2× slower** ❌
|
|
117
|
-
|
|
118
|
-
|Relative Path
|
|
119
|
-
|1.65µs
|
|
120
|
-
|4.66µs
|
|
121
|
-
|**2.82× faster** ✅
|
|
122
|
-
|
|
123
|
-
|Descendant Path
|
|
124
|
-
|12.73µs
|
|
125
|
-
|4.48µs
|
|
126
|
-
|**2.84× slower** ❌
|
|
127
|
-
|
|
128
|
-
|Wildcard
|
|
129
|
-
|10.55µs
|
|
130
|
-
|4.51µs
|
|
131
|
-
|**2.34× slower** ❌
|
|
132
|
-
|
|
133
|
-
|Attribute Access
|
|
134
|
-
|25.37µs
|
|
135
|
-
|4.76µs
|
|
136
|
-
|**5.33× slower** ❌
|
|
137
|
-
|
|
138
|
-
|Text Nodes
|
|
139
|
-
|12.85µs
|
|
140
|
-
|4.67µs
|
|
141
|
-
|**2.75× slower** ❌
|
|
142
|
-
|
|
143
|
-
|===
|
|
144
|
-
|
|
145
|
-
== position_predicates
|
|
146
|
-
|
|
147
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
148
|
-
|===
|
|
149
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
150
|
-
|
|
151
|
-
|First
|
|
152
|
-
|38.24µs
|
|
153
|
-
|5.95µs
|
|
154
|
-
|**6.43× slower** ❌
|
|
155
|
-
|
|
156
|
-
|Last
|
|
157
|
-
|14.06µs
|
|
158
|
-
|5.86µs
|
|
159
|
-
|**2.4× slower** ❌
|
|
160
|
-
|
|
161
|
-
|Position Eq
|
|
162
|
-
|11.34µs
|
|
163
|
-
|5.6µs
|
|
164
|
-
|**2.03× slower** ❌
|
|
165
|
-
|
|
166
|
-
|Position Range
|
|
167
|
-
|11.83µs
|
|
168
|
-
|5.56µs
|
|
169
|
-
|**2.13× slower** ❌
|
|
170
|
-
|
|
171
|
-
|===
|
|
172
|
-
|
|
173
|
-
== boolean_predicates
|
|
174
|
-
|
|
175
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
176
|
-
|===
|
|
177
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
178
|
-
|
|
179
|
-
|Attribute Exists
|
|
180
|
-
|11.91µs
|
|
181
|
-
|5.77µs
|
|
182
|
-
|**2.06× slower** ❌
|
|
183
|
-
|
|
184
|
-
|Attribute Value
|
|
185
|
-
|12.15µs
|
|
186
|
-
|7.24µs
|
|
187
|
-
|**1.68× slower** ❌
|
|
188
|
-
|
|
189
|
-
|Element Exists
|
|
190
|
-
|13.13µs
|
|
191
|
-
|7.57µs
|
|
192
|
-
|**1.73× slower** ❌
|
|
193
|
-
|
|
194
|
-
|Negation
|
|
195
|
-
|11.87µs
|
|
196
|
-
|6.21µs
|
|
197
|
-
|**1.91× slower** ❌
|
|
198
|
-
|
|
199
|
-
|===
|
|
200
|
-
|
|
201
|
-
== multiple_predicates
|
|
202
|
-
|
|
203
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
204
|
-
|===
|
|
205
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
206
|
-
|
|
207
|
-
|Two Predicates
|
|
208
|
-
|16.65µs
|
|
209
|
-
|6.86µs
|
|
210
|
-
|**2.43× slower** ❌
|
|
211
|
-
|
|
212
|
-
|Position And Boolean
|
|
213
|
-
|11.52µs
|
|
214
|
-
|11.17µs
|
|
215
|
-
|**1.03× slower** ❌
|
|
216
|
-
|
|
217
|
-
|Three Predicates
|
|
218
|
-
|16.73µs
|
|
219
|
-
|11.11µs
|
|
220
|
-
|**1.51× slower** ❌
|
|
221
|
-
|
|
222
|
-
|===
|
|
223
|
-
|
|
224
|
-
== nodeset_functions
|
|
225
|
-
|
|
226
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
227
|
-
|===
|
|
228
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
229
|
-
|
|
230
|
-
|Count
|
|
231
|
-
|10.64µs
|
|
232
|
-
|3.69µs
|
|
233
|
-
|**2.88× slower** ❌
|
|
234
|
-
|
|
235
|
-
|Last Func
|
|
236
|
-
|17.68µs
|
|
237
|
-
|5.06µs
|
|
238
|
-
|**3.49× slower** ❌
|
|
239
|
-
|
|
240
|
-
|Position Func
|
|
241
|
-
|12.61µs
|
|
242
|
-
|8.05µs
|
|
243
|
-
|**1.57× slower** ❌
|
|
244
|
-
|
|
245
|
-
|Local Name
|
|
246
|
-
|19.11µs
|
|
247
|
-
|13.09µs
|
|
248
|
-
|**1.46× slower** ❌
|
|
249
|
-
|
|
250
|
-
|Name
|
|
251
|
-
|15.31µs
|
|
252
|
-
|13.7µs
|
|
253
|
-
|**1.12× slower** ❌
|
|
254
|
-
|
|
255
|
-
|===
|
|
256
|
-
|
|
257
|
-
== string_functions
|
|
258
|
-
|
|
259
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
260
|
-
|===
|
|
261
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
262
|
-
|
|
263
|
-
|String
|
|
264
|
-
|13.64µs
|
|
265
|
-
|11.58µs
|
|
266
|
-
|**1.18× slower** ❌
|
|
267
|
-
|
|
268
|
-
|Concat
|
|
269
|
-
|43.93µs
|
|
270
|
-
|12.81µs
|
|
271
|
-
|**3.43× slower** ❌
|
|
272
|
-
|
|
273
|
-
|Starts With
|
|
274
|
-
|20.35µs
|
|
275
|
-
|7.64µs
|
|
276
|
-
|**2.66× slower** ❌
|
|
277
|
-
|
|
278
|
-
|Contains
|
|
279
|
-
|14.53µs
|
|
280
|
-
|9.3µs
|
|
281
|
-
|**1.56× slower** ❌
|
|
282
|
-
|
|
283
|
-
|String Length
|
|
284
|
-
|15.21µs
|
|
285
|
-
|8.94µs
|
|
286
|
-
|**1.7× slower** ❌
|
|
287
|
-
|
|
288
|
-
|===
|
|
289
|
-
|
|
290
|
-
== boolean_functions
|
|
291
|
-
|
|
292
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
293
|
-
|===
|
|
294
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
295
|
-
|
|
296
|
-
|Boolean
|
|
297
|
-
|10.76µs
|
|
298
|
-
|4.56µs
|
|
299
|
-
|**2.36× slower** ❌
|
|
300
|
-
|
|
301
|
-
|Not
|
|
302
|
-
|12.34µs
|
|
303
|
-
|6.8µs
|
|
304
|
-
|**1.81× slower** ❌
|
|
305
|
-
|
|
306
|
-
|True
|
|
307
|
-
|11.11µs
|
|
308
|
-
|5.15µs
|
|
309
|
-
|**2.16× slower** ❌
|
|
310
|
-
|
|
311
|
-
|===
|
|
312
|
-
|
|
313
|
-
== number_functions
|
|
314
|
-
|
|
315
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
316
|
-
|===
|
|
317
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
318
|
-
|
|
319
|
-
|Number
|
|
320
|
-
|12.6µs
|
|
321
|
-
|7.06µs
|
|
322
|
-
|**1.78× slower** ❌
|
|
323
|
-
|
|
324
|
-
|Sum
|
|
325
|
-
|14.71µs
|
|
326
|
-
|4.51µs
|
|
327
|
-
|**3.26× slower** ❌
|
|
328
|
-
|
|
329
|
-
|Floor
|
|
330
|
-
|18.48µs
|
|
331
|
-
|11.28µs
|
|
332
|
-
|**1.64× slower** ❌
|
|
333
|
-
|
|
334
|
-
|Ceiling
|
|
335
|
-
|22.09µs
|
|
336
|
-
|10.11µs
|
|
337
|
-
|**2.18× slower** ❌
|
|
338
|
-
|
|
339
|
-
|===
|
|
340
|
-
|
|
341
|
-
== complex_queries
|
|
342
|
-
|
|
343
|
-
[cols="["3", "2", "2", "2"]",options="header"]
|
|
344
|
-
|===
|
|
345
|
-
|Test |Leptris |Nokogiri |vs Nokogiri
|
|
346
|
-
|
|
347
|
-
|Multi Axis
|
|
348
|
-
|12.58µs
|
|
349
|
-
|6.44µs
|
|
350
|
-
|**1.95× slower** ❌
|
|
351
|
-
|
|
352
|
-
|Union
|
|
353
|
-
|24.42µs
|
|
354
|
-
|13.61µs
|
|
355
|
-
|**1.79× slower** ❌
|
|
356
|
-
|
|
357
|
-
|Nested
|
|
358
|
-
|18.96µs
|
|
359
|
-
|12.73µs
|
|
360
|
-
|**1.49× slower** ❌
|
|
361
|
-
|
|
362
|
-
|===
|
|
363
|
-
|
|
364
|
-
== Conclusion
|
|
365
|
-
|
|
366
|
-
Based on 50 comprehensive tests (vs Nokogiri):
|
|
367
|
-
|
|
368
|
-
* **Average Performance**: 2.34× slower
|
|
369
|
-
* **Tests faster**: 2/50 (4.0%)
|
|
370
|
-
* **Tests slower**: 48/50 (96.0%)
|
|
371
|
-
* **Best result**: 0.32×
|
|
372
|
-
* **Worst result**: 10.38×
|
|
373
|
-
|
|
374
|
-
❌ **Leptris performance needs optimization** - Significantly slower than Nokogiri (2.34× average).
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
**Generated**: 2025-11-27T18:27:43+0800
|
|
379
|
-
**Baseline**: Nokogiri
|