Less Array::map, more manual loops.

Map is slow. http://jsperf.com/arraymap
This commit is contained in:
Zixaphir 2014-03-11 13:43:23 -07:00
parent 08241a213f
commit dec9775f80
3 changed files with 157 additions and 101 deletions

View File

@ -3310,12 +3310,11 @@
return $.event('IndexRefresh');
},
buildHRs: function(threadRoots) {
var node, nodes, _i, _len;
var i, node, nodes;
nodes = [];
for (_i = 0, _len = threadRoots.length; _i < _len; _i++) {
node = threadRoots[_i];
nodes.push(node);
nodes.push($.el('hr'));
i = 0;
while (node = threadRoots[i++]) {
nodes.push(node, $.el('hr'));
}
return nodes;
},
@ -3360,7 +3359,7 @@
return Main.callbackNodes(Post, posts);
},
buildCatalogViews: function() {
var catalogThreads, thread, _i, _len, _ref;
var catalogThreads, nodes, thread, _i, _j, _len, _len1, _ref, _ref1;
catalogThreads = [];
_ref = Index.sortedThreads;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
@ -3370,9 +3369,13 @@
}
}
Main.callbackNodes(CatalogThread, catalogThreads);
return Index.sortedThreads.map(function(thread) {
return thread.catalogView.nodes.root;
});
nodes = [];
_ref1 = Index.sortedThreads;
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
thread = _ref1[_j];
nodes.push(thread.catalogView.nodes.root);
}
return nodes;
},
sizeCatalogViews: function(nodes) {
var height, node, ratio, size, thumb, width, _i, _len, _ref;
@ -3390,13 +3393,16 @@
}
},
sort: function() {
var sortedThreadIDs;
switch (Conf['Index Sort']) {
case 'bump':
sortedThreadIDs = Index.liveThreadIDs;
break;
case 'lastreply':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
var sortedThreadIDs, sortedThreads, threadID, _i, _len;
sortedThreads = [];
sortedThreadIDs = [];
({
'bump': function() {
return sortedThreadIDs = Index.liveThreadIDs;
},
'lastreply': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
var _ref, _ref1;
if ('last_replies' in a) {
_ref = a.last_replies, a = _ref[_ref.length - 1];
@ -3405,32 +3411,43 @@
_ref1 = b.last_replies, b = _ref1[_ref1.length - 1];
}
return b.no - a.no;
}).map(function(data) {
return data.no;
});
break;
case 'birth':
sortedThreadIDs = __slice.call(Index.liveThreadIDs).sort(function(a, b) {
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
},
'birth': function() {
return sortedThreadIDs = __slice.call(Index.liveThreadIDs).sort(function(a, b) {
return b - a;
});
break;
case 'replycount':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
},
'replycount': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
return b.replies - a.replies;
}).map(function(data) {
return data.no;
});
break;
case 'filecount':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
},
'filecount': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
return b.images - a.images;
}).map(function(data) {
return data.no;
});
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
}
})[Conf['Index Sort']]();
for (_i = 0, _len = sortedThreadIDs.length; _i < _len; _i++) {
threadID = sortedThreadIDs[_i];
sortedThreads.push(g.BOARD.threads[threadID]);
}
Index.sortedThreads = sortedThreadIDs.map(function(threadID) {
return g.BOARD.threads[threadID];
}).filter(function(thread) {
Index.sortedThreads = sortedThreads.filter(function(thread) {
return thread.isHidden === Index.showHiddenThreads;
});
if (Index.isSearching) {
@ -3455,7 +3472,7 @@
}
},
buildIndex: function(infinite) {
var nodes, pageNum, threads, threadsPerPage;
var nodes, pageNum, thread, threads, threadsPerPage, _i, _j, _len, _len1, _ref;
switch (Conf['Index Mode']) {
case 'paged':
case 'infinite':
@ -3466,9 +3483,11 @@
}
threadsPerPage = Index.getThreadsNumPerPage();
threads = Index.sortedThreads.slice(threadsPerPage * pageNum, threadsPerPage * (pageNum + 1));
nodes = threads.map(function(thread) {
return thread.OP.nodes.root.parentNode;
});
nodes = [];
for (_i = 0, _len = threads.length; _i < _len; _i++) {
thread = threads[_i];
nodes.push(thread.OP.nodes.root.parentNode);
}
Index.buildReplies(threads);
nodes = Index.buildHRs(nodes);
Index.buildPagelist();
@ -3479,9 +3498,12 @@
Index.sizeCatalogViews(nodes);
break;
default:
nodes = Index.sortedThreads.map(function(thread) {
return thread.OP.nodes.root.parentNode;
});
nodes = [];
_ref = Index.sortedThreads;
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
thread = _ref[_j];
nodes.push(thread.OP.nodes.root.parentNode);
}
Index.buildReplies(Index.sortedThreads);
nodes = Index.buildHRs(nodes);
}

View File

@ -3369,12 +3369,11 @@
return $.event('IndexRefresh');
},
buildHRs: function(threadRoots) {
var node, nodes, _i, _len;
var i, node, nodes;
nodes = [];
for (_i = 0, _len = threadRoots.length; _i < _len; _i++) {
node = threadRoots[_i];
nodes.push(node);
nodes.push($.el('hr'));
i = 0;
while (node = threadRoots[i++]) {
nodes.push(node, $.el('hr'));
}
return nodes;
},
@ -3419,7 +3418,7 @@
return Main.callbackNodes(Post, posts);
},
buildCatalogViews: function() {
var catalogThreads, thread, _i, _len, _ref;
var catalogThreads, nodes, thread, _i, _j, _len, _len1, _ref, _ref1;
catalogThreads = [];
_ref = Index.sortedThreads;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
@ -3429,9 +3428,13 @@
}
}
Main.callbackNodes(CatalogThread, catalogThreads);
return Index.sortedThreads.map(function(thread) {
return thread.catalogView.nodes.root;
});
nodes = [];
_ref1 = Index.sortedThreads;
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
thread = _ref1[_j];
nodes.push(thread.catalogView.nodes.root);
}
return nodes;
},
sizeCatalogViews: function(nodes) {
var height, node, ratio, size, thumb, width, _i, _len, _ref;
@ -3449,13 +3452,16 @@
}
},
sort: function() {
var sortedThreadIDs;
switch (Conf['Index Sort']) {
case 'bump':
sortedThreadIDs = Index.liveThreadIDs;
break;
case 'lastreply':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
var sortedThreadIDs, sortedThreads, threadID, _i, _len;
sortedThreads = [];
sortedThreadIDs = [];
({
'bump': function() {
return sortedThreadIDs = Index.liveThreadIDs;
},
'lastreply': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
var _ref, _ref1;
if ('last_replies' in a) {
_ref = a.last_replies, a = _ref[_ref.length - 1];
@ -3464,32 +3470,43 @@
_ref1 = b.last_replies, b = _ref1[_ref1.length - 1];
}
return b.no - a.no;
}).map(function(data) {
return data.no;
});
break;
case 'birth':
sortedThreadIDs = __slice.call(Index.liveThreadIDs).sort(function(a, b) {
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
},
'birth': function() {
return sortedThreadIDs = __slice.call(Index.liveThreadIDs).sort(function(a, b) {
return b - a;
});
break;
case 'replycount':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
},
'replycount': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
return b.replies - a.replies;
}).map(function(data) {
return data.no;
});
break;
case 'filecount':
sortedThreadIDs = __slice.call(Index.liveThreadData).sort(function(a, b) {
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
},
'filecount': function() {
var data, liveData, _i, _len;
liveData = __slice.call(Index.liveThreadData).sort(function(a, b) {
return b.images - a.images;
}).map(function(data) {
return data.no;
});
for (_i = 0, _len = liveData.length; _i < _len; _i++) {
data = liveData[_i];
sortedThreadIDs.push(data.no);
}
}
})[Conf['Index Sort']]();
for (_i = 0, _len = sortedThreadIDs.length; _i < _len; _i++) {
threadID = sortedThreadIDs[_i];
sortedThreads.push(g.BOARD.threads[threadID]);
}
Index.sortedThreads = sortedThreadIDs.map(function(threadID) {
return g.BOARD.threads[threadID];
}).filter(function(thread) {
Index.sortedThreads = sortedThreads.filter(function(thread) {
return thread.isHidden === Index.showHiddenThreads;
});
if (Index.isSearching) {
@ -3514,7 +3531,7 @@
}
},
buildIndex: function(infinite) {
var nodes, pageNum, threads, threadsPerPage;
var nodes, pageNum, thread, threads, threadsPerPage, _i, _j, _len, _len1, _ref;
switch (Conf['Index Mode']) {
case 'paged':
case 'infinite':
@ -3525,9 +3542,11 @@
}
threadsPerPage = Index.getThreadsNumPerPage();
threads = Index.sortedThreads.slice(threadsPerPage * pageNum, threadsPerPage * (pageNum + 1));
nodes = threads.map(function(thread) {
return thread.OP.nodes.root.parentNode;
});
nodes = [];
for (_i = 0, _len = threads.length; _i < _len; _i++) {
thread = threads[_i];
nodes.push(thread.OP.nodes.root.parentNode);
}
Index.buildReplies(threads);
nodes = Index.buildHRs(nodes);
Index.buildPagelist();
@ -3538,9 +3557,12 @@
Index.sizeCatalogViews(nodes);
break;
default:
nodes = Index.sortedThreads.map(function(thread) {
return thread.OP.nodes.root.parentNode;
});
nodes = [];
_ref = Index.sortedThreads;
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
thread = _ref[_j];
nodes.push(thread.OP.nodes.root.parentNode);
}
Index.buildReplies(Index.sortedThreads);
nodes = Index.buildHRs(nodes);
}

View File

@ -616,9 +616,9 @@ Index =
buildHRs: (threadRoots) ->
nodes = []
for node in threadRoots
nodes.push node
nodes.push $.el 'hr'
i = 0
while node = threadRoots[i++]
nodes.push node, $.el 'hr'
nodes
buildReplies: (threads) ->
@ -651,7 +651,9 @@ Index =
for thread in Index.sortedThreads when !thread.catalogView
catalogThreads.push new CatalogThread Build.catalogThread(thread), thread
Main.callbackNodes CatalogThread, catalogThreads
Index.sortedThreads.map (thread) -> thread.catalogView.nodes.root
nodes = []
nodes.push thread.catalogView.nodes.root for thread in Index.sortedThreads
return nodes
sizeCatalogViews: (nodes) ->
# XXX When browsers support CSS3 attr(), use it instead.
@ -666,24 +668,32 @@ Index =
return
sort: ->
switch Conf['Index Sort']
when 'bump'
sortedThreads = []
sortedThreadIDs = []
{
'bump': ->
sortedThreadIDs = Index.liveThreadIDs
when 'lastreply'
sortedThreadIDs = [Index.liveThreadData...].sort (a, b) ->
'lastreply': ->
liveData = [Index.liveThreadData...].sort (a, b) ->
[..., a] = a.last_replies if 'last_replies' of a
[..., b] = b.last_replies if 'last_replies' of b
b.no - a.no
.map (data) -> data.no
when 'birth'
sortedThreadIDs.push data.no for data in liveData
return
'birth': ->
sortedThreadIDs = [Index.liveThreadIDs...].sort (a, b) -> b - a
when 'replycount'
sortedThreadIDs = [Index.liveThreadData...].sort((a, b) -> b.replies - a.replies).map (data) -> data.no
when 'filecount'
sortedThreadIDs = [Index.liveThreadData...].sort((a, b) -> b.images - a.images).map (data) -> data.no
Index.sortedThreads = sortedThreadIDs
.map (threadID) -> g.BOARD.threads[threadID]
.filter (thread) -> thread.isHidden is Index.showHiddenThreads
'replycount': ->
liveData = [Index.liveThreadData...].sort((a, b) -> b.replies - a.replies)
sortedThreadIDs.push data.no for data in liveData
return
'filecount': ->
liveData = [Index.liveThreadData...].sort((a, b) -> b.images - a.images)
sortedThreadIDs.push data.no for data in liveData
return
}[Conf['Index Sort']]()
sortedThreads.push g.BOARD.threads[threadID] for threadID in sortedThreadIDs
Index.sortedThreads = sortedThreads.filter (thread) -> thread.isHidden is Index.showHiddenThreads
if Index.isSearching
Index.sortedThreads = Index.querySearch(Index.searchInput.value) or Index.sortedThreads
# Sticky threads
@ -707,7 +717,8 @@ Index =
return
threadsPerPage = Index.getThreadsNumPerPage()
threads = Index.sortedThreads[threadsPerPage * pageNum ... threadsPerPage * (pageNum + 1)]
nodes = threads.map (thread) -> thread.OP.nodes.root.parentNode
nodes = []
nodes.push thread.OP.nodes.root.parentNode for thread in threads
Index.buildReplies threads
nodes = Index.buildHRs nodes
Index.buildPagelist()
@ -716,7 +727,8 @@ Index =
nodes = Index.buildCatalogViews()
Index.sizeCatalogViews nodes
else
nodes = Index.sortedThreads.map (thread) -> thread.OP.nodes.root.parentNode
nodes = []
nodes.push thread.OP.nodes.root.parentNode for thread in Index.sortedThreads
Index.buildReplies Index.sortedThreads
nodes = Index.buildHRs nodes
$.rmAll Index.root unless infinite