1

在 cytoscape.js 中,我试图为 329 节点网络中的每个节点更改两个节点属性的值。

这有效,但需要 86 秒。我希望它会快得多。这是我的代码:

var data = // data of the form {lfc: {key1: 0.01, key2: 0.02, ...}, pval: {key1: 0.03,  key2: 0.04, ...}};
var nodes = cy.nodes();
console.log('starting to update node data...');
var start = new Date().getTime();
for (var i = 0; i < nodes.length; i++)
{
  var node = nodes[i];
  var id = node.data("id");
  var lfc = data['lfc'][id];
  var pval = data['pval'][id];
  node.data({lfc: lfc, pval: pval});
}
var end = new Date().getTime();
console.log("finished in " + (end - start) + "ms");

我知道如果我将网络中所有节点的属性设置为相同的值,它会快得多。这大约需要半秒钟:

var start = new Date().getTime();
cy.nodes().data({lfc: 1.0, pval: 1.0});
var end = new Date().getTime();
console.log("finished in " + (end - start) + "ms");

但由于我试图给每个节点单独的值,我不能这样做。

有什么提高性能的想法吗?

4

1 回答 1

2

在循环中调用这样的函数的问题在于,每次迭代都会导致事件和通知给渲染器——因为可能需要视觉更新。正如您所指出的,批量添加/加载时这不是问题,因为这只会生成一个通知。

理想的架构是在初始化 cytoscape.js 之前加载您需要的所有元素,然后在服务器上更改单个节点时更新它们。轮询服务器并更新所有节点可能会导致加载性能以外的其他问题。

于 2013-02-11T17:54:30.667 回答