从Node HTTP请求中运行的algorithm需要更长的时间才能运行

我有一个节点的应用程序,绘制在一个x,y点图的数据。 目前,我从前端发出GET请求,后端节点服务器接受请求,循环访问数据点arrays,使用Node Canvas绘制canvas,并将其传回到显示为PNG图像的前端。

复杂的事情是可以有多边形,所以我的algorithm计算一个点是否在一个多边形内,使用多边形包中的点 ,以及数据点的颜色,如果它是不同的。

这在less于50,000个数据点的情况下工作正常。 但是,如果有80万个请求需要大约23秒。 我已经对代码进行了剖析,大部分时间都是循环遍历所有的数据点,并找出在canvas上绘制的位置以及颜色(取决于它是否在一个或多个多边形中)。 这是我做的一个笨蛋 。 基本上我做这样的事情:

for (var i = 0; i < data.length; i++) { // get raw points x = data[i][0]; y = data[i][1]; // convert to a point on canvas pointX = getPointOnCanvas(x); pointY = getPointOnCanvas(y, 'y'); color = getColorOfCell(pointX, pointY); color = color; plotColor.push({ color: color, pointX: pointX, pointY : pointY }); } // draw the dots down here 

algorithm本身不是问题。 我遇到的问题是,当algorithm在HTTP请求中运行时,计算一个点的颜色需要很长时间 – 大约16秒。 但是如果在前端使用铬,就需要一秒多的时间。 当我使用Node在命令行上运行algorithm时,它不到一秒钟。 所以我的应用程序在HTTP请求中运行algorithm的事实正在大大减缓它的速度。 所以几个问题:

为什么会这样? 为什么从一个HTTP请求中运行一个algorithm需要更长的时间?

如果有的话,我能做些什么来解决这个问题? 是否有可能做出请求来启动任务,然后在完成时通知前端并检索PNG?

编辑我完全testing运行的algorithm,并通过命令行创build一个PNG。 计算800k个数据点应该是多less颜色要快得多,不到半秒。 我想使用套接字向服务器发出请求并启动任务,然后让它返回映像。 我很困惑,为什么代码在HTTP请求中运行需要这么长时间…

编辑问题是蒙戈和mongoose。 我在Mongo中存储每个多边形的坐标。 我获取这些坐标一次,但是当我比较他们每个x,y点/。 不知何故,这是大大拖延了algorithm。 如果我closures了Mongo文件,algorithm从16秒到1.5秒……

Edit @DevDig指出了注释部分的主要问题 – 使用Mongoose对象时,有很多getter和setter放慢了速度。 在查询中使用lean()将algorithm从16秒缩短到1.5秒

刚刚完成将您的代码版本作为nodeJS服务运行。 代码是从你的抢劫者身上得到的。 数据执行时间为171毫秒(10K行10次复制,下面是我做的:

首先,你的data.json和gates.json文件不是真正的JSON文件,它们是JavaScript文件。 我从前面删除了var data / gates =语句,并删除了结尾的分号。 您遇到的问题可能与您的应用中的数据集的阅读方式有关。 由于您不修改门或数据,所以我将它们作为服务器上的设置的一部分来读取,这正是您在浏览器中处理的方式。 如果每次访问服务器时都需要读取这些文件,那当然会改变时间。 这一改变将执行时间从171毫秒减less到了515毫秒 – 仍然与您所看到的没有任何关系。 这是在MacBook Pro上执行。 如果需要,我可以从networking访问的云服务器更新时间。

获取文件:

  var fs = require("fs"); var path = require("path"); var data = []; var allGatesChain; var events = []; var x, y, pointX, pointY; var filename = __dirname + "/data.txt"; data = JSON.parse(fs.readFileSync(filename, "utf-8")); filename = __dirname + "/gates.json"; var gates = JSON.parse(fs.readFileSync(filename, "utf-8")); 

我移动你的例程创buildallGatesChain和事件到导出的函数中:

  allGatesChain = getAllGatesChain(); generateData(); console.log("events is "+events.length+" elements long. events[0] is: "+events[0]); console.log("data is "+data.length+" elements long. data[0] is "+data[0]); 

然后运行你的代码:

  var start, end; var plotColor = []; start = new Date().getTime(); for (var i = 0; i < data.length; i++) { // get raw points x = data[i][0]; y = data[i][1]; // convert to a point on canvas pointX = getPointOnCanvas(x); pointY = getPointOnCanvas(y, 'y'); color = getColorOfCell({ gateChain: allGatesChain, events: events, i: i }); color = color; plotColor.push({ color: color, pointX: pointX, pointY : pointY }); } end = new Date().getTime(); var _str = "loop execution took: "+(end-start)+" milliseconds."; console.log(_str); res.send(_str); 

结果是171毫秒。