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
1.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Front-end performance - Making lunr.js fast
Three stories about making lunr.js searching fast
Oliver Nightingale
May 02, 2013
More Decks by Oliver Nightingale
See All by Oliver Nightingale
d3_meetup_20120130.pdf
olivernn
1
65
D3 Geo Visualisations
olivernn
3
2k
Other Decks in Technology
See All in Technology
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
400
AI時代におけるプロダクト横断勉強会の設計
zozotech
PRO
0
160
PfEingのアプローチで働こう
rindrics
0
180
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
360
2026-09-04 SRE Tech Talk #15 怠惰なTerraform / Lazy Terraform
masasuzu
0
200
その指示、Bobにしっかり伝わってる?初心者でも即実践できる プロンプト/コンテキスト設計のコツ
muehara
1
170
Beyond the Hype: Practical AI for Your Oracle Database with MCP
thatjeffsmith
1
270
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
320
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
130
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
230
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
130
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Code Reviewing Like a Champion
maltzj
528
40k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
870
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
290
Facilitating Awesome Meetings
lara
57
7.1k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
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