hexo-util
hexo-util copied to clipboard
perf(escapeHTML): use multiple replace
Benchmark: https://runkit.com/sukkaw/5e3003ffe7e84c0013f6210d
const Benchmark = require('benchmark');
const Suite = new Benchmark.Suite;
const html = `<p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p>`;
const htmlEntityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': ''',
'`': '`',
'/': '/',
'=': '='
};
Suite.add('Map replacement', () => {
html.replace(/[&<>"'`/=]/g, a => htmlEntityMap[a]);
}).add('Multiple replace', () => {
html.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/\\/g, ''').replace(/`/g, '`').replace(/\//g, '/').replace(/=/g, '=');
}).on('cycle', function(event) {
console.info(String(event.target));
}).run();
On my local computer, Multiple replace
is the slower one under Node.js 10 but it is the faster one under Node.js 12 & 13:
Coverage decreased (-0.01%) to 96.979% when pulling 087af7138f95f00b526c5be77bf45a0459b66d64 on SukkaW:perf-escape-unescape into 4e7c24e2174436cca57a0fcd9cc2c68b42e2607a on hexojs:master.
Coverage decreased (-0.01%) to 96.979% when pulling 087af7138f95f00b526c5be77bf45a0459b66d64 on SukkaW:perf-escape-unescape into 4e7c24e2174436cca57a0fcd9cc2c68b42e2607a on hexojs:master.
I modified the source text to include all special characters.
const html = `<p class="foo">Hello "world&".</p><p class="foo">Hello "world\"".</p><p class="foo">Hello "world\`".</p><p class="foo">Hello "world=".</p><p class="foo">Hello "world\\".</p><p class="foo">Hello "world&".</p><p class="foo">Hello "world\"".</p><p class="foo">Hello "world\`".</p><p class="foo">Hello "world=".</p><p class="foo">Hello "world\\".</p><p class="foo">Hello "world&".</p><p class="foo">Hello "world\"".</p><p class="foo">Hello "world\`".</p><p class="foo">Hello "world=".</p><p class="foo">Hello "world\\".</p><p class="foo">Hello "world&".</p><p class="foo">Hello "world\"".</p><p class="foo">Hello "world\`".</p><p class="foo">Hello "world=".</p><p class="foo">Hello "world\\".</p><p class="foo">Hello "world&".</p><p class="foo">Hello "world\"".</p><p class="foo">Hello "world\`".</p><p class="foo">Hello "world=".</p><p class="foo">Hello "world\\".</p><p class="foo">Hello "world".</p><p class="foo">Hello "world".</p>`;
The result of benchmark with Node v12 is reversal.
Multiple replace
is slower.
The result of benchmark with Node v13 is same as SukkaW's report.
Multiple replace
is faster.
It is certain that my sample source text is unusual HTML. I only show that this patch is not all-around. Because this patch sacrifices readability, the profit seems too little.
More performance benchmark needs to be done before we merge this.