Skip to content

Commit 1cce9f0

Browse files
zaaackalfonsogarciacaro
authored andcommitted
Make escapeHtml faster
1 parent 3186771 commit 1cce9f0

File tree

2 files changed

+41
-48
lines changed

2 files changed

+41
-48
lines changed

docs/server-side-rendering.md

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -274,45 +274,45 @@ Here is the benchmark result on a linux laptop (Intel Core i7-3630QM, 8 core), r
274274

275275
dotnet ./bin/Release/netcoreapp2.0/dotnet.dll
276276
Thread 1 started
277-
Thread 1 render 160000 times used 25146ms
278-
[Single thread] 25146ms 6362.841req/s
277+
Thread 1 render 160000 times used 23062ms
278+
[Single thread] 23062ms 6937.820req/s
279279
Thread 1 started
280280
Thread 3 started
281281
Thread 4 started
282+
Thread 6 started
282283
Thread 5 started
283284
Thread 7 started
284-
Thread 8 started
285+
Thread 10 started
285286
Thread 9 started
286-
Thread 6 started
287-
Thread 3 render 20000 times used 10370ms
288-
Thread 9 render 20000 times used 10409ms
289-
Thread 6 render 20000 times used 10421ms
290-
Thread 4 render 20000 times used 10434ms
291-
Thread 7 render 20000 times used 10445ms
292-
Thread 1 render 20000 times used 10458ms
293-
Thread 5 render 20000 times used 10483ms
294-
Thread 8 render 20000 times used 10497ms
295-
[8 tasks] Total: 10439ms Memory footprint: 43.266MB Requests/sec: 15327.139
287+
Thread 3 render 20000 times used 9593ms
288+
Thread 5 render 20000 times used 9689ms
289+
Thread 10 render 20000 times used 9693ms
290+
Thread 9 render 20000 times used 9705ms
291+
Thread 4 render 20000 times used 9720ms
292+
Thread 1 render 20000 times used 9753ms
293+
Thread 7 render 20000 times used 9757ms
294+
Thread 6 render 20000 times used 9795ms
295+
[8 tasks] Total: 9713ms Memory footprint: 44.063MB Requests/sec: 16472.768
296296

297297
/usr/local/bin/node ./node.js
298-
Master 3266 is running
299-
[Single process] 33702ms 4747.493req/s
300-
Worker 3275: started
301-
Worker 3281: started
302-
Worker 3303: started
303-
Worker 3289: started
304-
Worker 3304: started
305-
Worker 3296: started
306-
Worker 3320: started
307-
Worker 3317: started
308-
Worker 3281: render 20000 times used 10247ms
309-
Worker 3289: render 20000 times used 10709ms
310-
Worker 3275: render 20000 times used 11048ms
311-
Worker 3303: render 20000 times used 11119ms
312-
Worker 3296: render 20000 times used 11188ms
313-
Worker 3320: render 20000 times used 11359ms
314-
Worker 3304: render 20000 times used 11370ms
315-
Worker 3317: render 20000 times used 11574ms
316-
[8 workers] Total: 11076.75ms Memory footprint: 200.066MB Requests/sec: 14444.670
298+
Master 10891 is running
299+
[Single process] 34322ms 4661.733req/s
300+
Worker 10911: started
301+
Worker 10916: started
302+
Worker 10928: started
303+
Worker 10942: started
304+
Worker 10930: started
305+
Worker 10935: started
306+
Worker 10922: started
307+
Worker 10951: started
308+
Worker 10911: render 20000 times used 11394ms
309+
Worker 10935: render 20000 times used 11353ms
310+
Worker 10928: render 20000 times used 11522ms
311+
Worker 10922: render 20000 times used 11492ms
312+
Worker 10916: render 20000 times used 11812ms
313+
Worker 10930: render 20000 times used 11913ms
314+
Worker 10951: render 20000 times used 11781ms
315+
Worker 10942: render 20000 times used 12236ms
316+
[8 workers] Total: 11687.875ms Memory footprint: 200.066MB Requests/sec: 13689.400
317317

318318
```

src/Fable.React/Fable.Helpers.ReactServer.fs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,15 @@ let private voidTags = System.Collections.Generic.HashSet<_>(["area"; "base"; "b
1515

1616
// Adapted from https://github.com/facebook/react/blob/37e4329bc81def4695211d6e3795a654ef4d84f5/packages/react-dom/src/server/escapeTextForBrowser.js#L49
1717
let escapeHtml (sb:StringBuilder) (str: string) =
18-
let splits = str.Split('"', '\'', '&', '<', '>')
19-
let mutable charIndex = -1
20-
for i = 0 to splits.Length - 2 do
21-
let part = splits.[i]
22-
sb.Append part |> ignore
23-
charIndex <- charIndex + part.Length + 1
24-
let char = str.[charIndex]
25-
match char with
18+
for c in str.ToCharArray() do
19+
match c with
2620
| '"' -> sb.Append("&quot")
2721
| '&' -> sb.Append("&amp;")
2822
| ''' -> sb.Append("&#x27;") // modified from escape-html; used to be '&#39'
2923
| '<' -> sb.Append("&lt;")
3024
| '>' -> sb.Append("&gt;")
3125
| c -> sb.Append(c)
3226
|> ignore
33-
sb.Append(Array.last splits) |> ignore
3427

3528
let inline private addUnit (html:StringBuilder) (key: string) (value: string) =
3629
html.Append value |> ignore
@@ -40,7 +33,7 @@ let inline private addUnit (html:StringBuilder) (key: string) (value: string) =
4033
let private cssProp (html:StringBuilder) (key: string) (value: obj) =
4134
html.Append key |> ignore
4235
html.Append ':' |> ignore
43-
36+
4437
match value with
4538
| :? int as v -> addUnit html key (string v)
4639
| :? float as v -> addUnit html key (string v)
@@ -622,7 +615,7 @@ let private renderHtmlAttr (html:StringBuilder) (attr: HTMLAttr) =
622615

623616
for cssProp in cssList do
624617
renderCssProp html cssProp
625-
618+
626619
html.Append '"' |> ignore
627620

628621
| HTMLAttr.Custom (key, value) -> strAttr html (key.ToLower()) (string value)
@@ -723,9 +716,9 @@ let rec private addReactMark htmlNode =
723716
| h -> h
724717

725718
let inline private castHTMLNode (htmlNode: ReactElement): HTMLNode =
726-
if isNull htmlNode then
719+
if isNull htmlNode then
727720
HTMLNode.Empty
728-
else
721+
else
729722
htmlNode :?> HTMLNode
730723

731724
let renderToString (htmlNode: ReactElement): string =
@@ -742,11 +735,11 @@ let renderToString (htmlNode: ReactElement): string =
742735

743736
let child = renderAttrs html attrs tag
744737

745-
if voidTags.Contains tag then
738+
if voidTags.Contains tag then
746739
html.Append "/>" |> ignore
747-
else
740+
else
748741
html.Append '>' |> ignore
749-
742+
750743
match child with
751744
| Some c -> html.Append c |> ignore
752745
| None ->

0 commit comments

Comments
 (0)