Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Front-end performance - Making lunr.js fast
Search
Oliver Nightingale
May 02, 2013
Technology
2
1.3k
Front-end performance - Making lunr.js fast
Three stories about making lunr.js searching fast
Oliver Nightingale
May 02, 2013
Tweet
Share
More Decks by Oliver Nightingale
See All by Oliver Nightingale
d3_meetup_20120130.pdf
olivernn
1
58
D3 Geo Visualisations
olivernn
3
2k
Other Decks in Technology
See All in Technology
M5と自作基板をくっつけてみた〜M5 Japan Tour 2024 Spring 福冈 (Fukuoka|福岡)〜
keropiyo
0
170
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
5
18k
Azureの基本的な権限管理の勉強会
yhana
1
2.1k
ルーターでプレゼンする
puhitaku
1
3.3k
How to do well in consulting–Balkan Ruby 2024
irinanazarova
0
150
生成AIの変革の時代に、直近1年で直面した課題とその解決策
ktc_wada
0
700
LayerXにおけるLLMプロダクト開発の今までとこれから
layerx
PRO
4
750
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
5
37k
Gradle Build Scanを使ってビルドのことを知ろう potatotips #87
tomorrowkey
2
160
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
420
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
260
2023年度にEMとして頑張ったこと
ikefukurou777
0
100
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
6.9k
It's Worth the Effort
3n
180
27k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
20
1.8k
Gamification - CAS2011
davidbonilla
77
4.6k
Building Effective Engineering Teams - LeadDev
addyosmani
32
1.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Producing Creativity
orderedlist
PRO
338
39k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
Six Lessons from altMBA
skipperchong
22
3k
Designing for humans not robots
tammielis
247
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
The Invisible Side of Design
smashingmag
294
49k
Transcript
FRONT-END PERFORMANCE MAKING LUNR.JS FAST Thursday, 2 May 13
100% CPU BOUND Thursday, 2 May 13
PROFILE TOOL Thursday, 2 May 13
BENCHMARK ๏ CONSOLE.TIME(‘ZOMG SLOW’) ๏ JSPERF.COM ๏ BENCHMARK.JS BEFORE &
AFTER Thursday, 2 May 13
DO LESS GO QUICKER Thursday, 2 May 13
lunr.Vector = function (elements) { this.elements = elements for (var
i = 0; i < elements.length; i++) { if ( !(i in this.elements) ) this.elements[i] = 0 } } BEFORE Thursday, 2 May 13
lunr.Vector = function (elements) { this.elements = elements } AFTER
Thursday, 2 May 13
var zeros = [0] var zeroFillArray = function (length) {
while (zeros.length < length) { zeros = zeros.concat(zeros) } return zeros.slice(0, length) } ELSEWHERE Thursday, 2 May 13
RESULTS 10 100 1000 10000 100000 1000000 NON ZERO FILLED
ARRAY ZERO FILLED ARRAY 774,676 ops/s 3,234 ops/s http://jsperf.com/lunr-vector-init Thursday, 2 May 13
LESS RECURSION FUNCTION OVER-HEAD Thursday, 2 May 13
EVIDENCE Thursday, 2 May 13
lunr.TokenStore.prototype.getNode = function (token, root) { var root = root
|| this.root, key = token[0], rest = token.slice(1) if (!(key in root)) return {} if (rest.length === 0) { return root[key] } else { return this.getNode(rest, root[key]) } } BEFORE Thursday, 2 May 13
lunr.TokenStore.prototype.getNode = function (token) { if (!token) return {} var
node = this.root for (var i = 0; i < token.length; i++) { if (!(token[i] in node)) return {} node = node[token[i]] } return node } AFTER Thursday, 2 May 13
RESULTS 40000 80000 120000 160000 RECURSIVE ITERATIVE 152,008 ops/s 103,070
ops/s http://jsperf.com/lunr-tokenstore-getnode/2 Thursday, 2 May 13
BIG OHHH CHOOSING THE RIGHT ALGORITHM Thursday, 2 May 13
lunr.SortedSet = function () { this.length = 0 this.elements =
[] } SIMPLE DATA STRUCTURE Thursday, 2 May 13
OPERATIONS ๏ ADD(ELEM) ๏ INDEX_OF(ELEM) SORTED SET Thursday, 2 May
13
lunr.SortedSet.prototype.add = function (elem) { if (~this.elements.indexOf(elem)) return this.elements.push(elem) this.length++
this.elements.sort() } BEFORE Thursday, 2 May 13
SORT O(n log n) Thursday, 2 May 13
INDEX_OF O(n) Thursday, 2 May 13
lunr.SortedSet.prototype.add = function (elem) { if (~this.indexOf(elem)) return this.elements.splice(this.locationFor(elem), 0,
elem) this.length = this.elements.length } AFTER Thursday, 2 May 13
BINARY SEARCH O(log n) Thursday, 2 May 13
lunr.SortedSet.prototype.indexOf = function (elem, start, end) { var start =
start || 0, end = end || this.elements.length, sectionLength = end - start, pivot = start + Math.floor(sectionLength / 2), pivotElem = this.elements[pivot] if (sectionLength <= 1) { if (pivotElem === elem) { return pivot } else { return -1 } } if (pivotElem < elem) return this.indexOf(elem, pivot, end) if (pivotElem > elem) return this.indexOf(elem, start, pivot) if (pivotElem === elem) return pivot } ELSEWHERE Thursday, 2 May 13
lunr.SortedSet.prototype.locationFor = function (elem, start, end) { var start =
start || 0, end = end || this.elements.length, sectionLength = end - start, pivot = start + Math.floor(sectionLength / 2), pivotElem = this.elements[pivot] if (sectionLength <= 1) { if (pivotElem > elem) return pivot if (pivotElem < elem) return pivot + 1 } if (pivotElem < elem) return this.locationFor(elem, pivot, end) if (pivotElem > elem) return this.locationFor(elem, start, pivot) } MORE ELSEWHERE Thursday, 2 May 13
RESULTS 100 10000 1000000 LOW VALUE HIGH VALUE NON EXISTANT
INDEX_OF BINARY_SEARCH INDEX_OF BINARY_SEARCH INDEX_OF BINARY_SEARCH 4,818,044 ops/s 5,521,920 ops/s 4,768,333 ops/s 14,445 ops/s 23,150 ops/s 1,697,089 ops/s http://jsperf.com/lunr-sortedset-indexof Thursday, 2 May 13
END USER PERF THIS IS WHAT REALLY MATTERS Thursday, 2
May 13
RESULTS 75 150 225 300 0.2.0 0.4.0 38.477 ms 240.865
ms lunr.Index.prototype.search Thursday, 2 May 13