LRUMap implements the parts of an ordered map that we need to efficiently implement DynamicCharAtlas. It's more code, but there's a few advantages of this approach: - Map isn't available on some older browsers, so this removes the need for a polyfill. - Moving an item to the end of the map's iteration order now only requires unlinking and linking a linked-list node, whereas before we had to delete and re-insert our value. - Peeking at the oldest entry in the map no longer requires allocating and destroying an iterator. - We can preallocate the linked-list nodes we want to improve cache locality. Similarly, we can recycle linked-list nodes to reduce allocations and the GC pauses those allocations may cause. - LRUMap seems to give slightly better results in Chrome's profiler than Map did. We now spend about 5% of our time on map operations instead of about 10%. - In my (limited) testing, it doesn't look like LRUMap is slowing down over time. Map appeared to get slightly slower the longer I ran the terminal for, either due to memory fragmentation or some sort of leak. I still need to write some tests for LRUMap, but I've been using this implementation for the last hour without problems.
24 lines
365 B
JSON
24 lines
365 B
JSON
{
|
|
"compilerOptions": {
|
|
"module": "commonjs",
|
|
"target": "es5",
|
|
"lib": [
|
|
"DOM",
|
|
"ES5",
|
|
"ScriptHost",
|
|
"ES2015.Promise"
|
|
],
|
|
"rootDir": "src",
|
|
"outDir": "lib",
|
|
"sourceMap": true,
|
|
"removeComments": true,
|
|
"noUnusedLocals": true
|
|
},
|
|
"include": [
|
|
"src/**/*"
|
|
],
|
|
"exclude": [
|
|
"src/addons/**/*"
|
|
]
|
|
}
|