[英]How to speed up tree creation
我有這段代碼來生成一個臨時樹,其代碼如下
object regionSale = regionValue.GetValueAsString();
if (root.Children.Count > 0)
{
if ((tmpNode.Data.Level) == (levelNested - 1))
{
var newChild = new Node
{
Data = new NodeData
{
Level = levelNested,
RegionName = elemNested.GetValueAsString(),
RegionValue = NAValue.Equals(regionSale.ToString())
? null
: (double?)regionValue.GetValueAsFloat64()
},
Parent = tmpNode
};
tmpNode.Children.Add(newChild);
tmpNode = newChild;
}
else if (tmpNode.Data.Level == levelNested)
{
var node = tmpNode.Parent;
var newChild = new Node
{
Data = new NodeData
{
Level = levelNested,
RegionName = elemNested.GetValueAsString(),
RegionValue = NAValue.Equals(regionSale.ToString())
? null
: (double?)regionValue.GetValueAsFloat64()
},
Parent = node
};
node.Children.Add(newChild);
tmpNode = newChild;
}
else
{
var parentNode = tmpNode.Parent;
while ((parentNode.Data.Level) != (levelNested - 1))
{
parentNode = parentNode.Parent;
}
var newChild = new Node
{
Data = new NodeData
{
Level = levelNested,
RegionName = elemNested.GetValueAsString(),
RegionValue = NAValue.Equals(regionSale.ToString())
? null
: (double?)regionValue.GetValueAsFloat64()
},
Parent = parentNode
};
parentNode.Children.Add(newChild);
tmpNode = newChild;
}
}
else
{
var children = new Node();
children.Data = new NodeData
{
Level = levelNested,
RegionName = elemNested.GetValueAsString(),
RegionValue = NAValue.Equals(regionSale.ToString())
? null
: (double?)regionValue.GetValueAsFloat64()
};
children.Parent = root;
root.Children.Add(children);
tmpNode = children;
}
傳遞給此函數的數據是一個根節點,例如:
for (var nestedIndex = 0; nestedIndex < numofBulkValues; nestedIndex++)
{
var bulkElementNested = refBulkField.GetValueAsElement(nestedIndex);
var elemNested = bulkElementNested.GetElement(0);
var levelElement = bulkElementNested.GetElement(1);
var regionValue = bulkElementNested.GetElement(2);
var levelNested = levelElement.GetValueAsInt32();
tmpNode = GenerateTree(root, tmpNode, elemNested, regionValue, levelNested);
}
在這種情況下,我得到的數據格式為
ADSK UW EQUITY
Europe, Middle East and Africa Level=1
The Americas Level=1
U.S Level=2
Other Americas Level=2
The Asia/Pacific Level=1
Other Asia/Pacific Level=2
Japan Level=2
Reconciliation Level=1
並且有很多這樣的股票。 問題在於此過程需要很長時間,幾乎要花9秒鍾,而顯示實際結果只需要16秒鍾。 是的,這是應用程序的核心,非常重要,因此不能跳過。 有什么方法可以減少創建此樹的時間?
我的節點類如下:
public class Node
{
public Node()
{
}
public Node(Node node)
: this()
{
if (node == null)
return;
this.Data = new NodeData(node.Data);
if (node.Children != null)
this.Children = new List<Node>(node.Children);
this.Parent = new Node(node.Parent);
}
public NodeData Data;
public List<Node> Children = new List<Node>();
public Node Parent;
}
public class NodeData
{
public NodeData()
{
}
public NodeData(NodeData nodeData)
: this()
{
if (nodeData == null)
return;
this.RegionName = nodeData.RegionName;
this.RegionValue = nodeData.RegionValue;
this.Level = nodeData.Level;
}
public string RegionName;
public double? RegionValue;
public int Level;
}
如果還有更多我可以提供的信息,請告訴我。 並感謝您的幫助
好的,
因此,我要做的是對Node.cs類進行了如下更改:
public class Node
{
public Node()
{
}
public Node(Node node)
: this()
{
if (node == null)
return;
if (node.Children != null)
this.Children = new List<Node>(node.Children);
this.Parent = new Node(node.Parent);
this.RegionName = nodeData.RegionName;
this.RegionValue = nodeData.RegionValue;
this.Level = nodeData.Level;
}
public List<Node> Children = new List<Node>();
public Node Parent;
public string RegionName;
public double? RegionValue;
public int Level;
}
我也檢查了記錄日志的功能,所以被稱為很多(用於..)的小功能我已經刪除了那些日志。 所有這一切將900只股票的時間從4.30分鍾減少到大約1.30分鍾。 但我想問一下是否還有其他方法可以使它更快。
還有一個問題:只有一個函數從數據庫(sqlite數據庫)中提取數據,connection.Open()需要大量時間。 這個問題可能是因為連接長時間處於打開狀態嗎? 或者是否有可能已經打開了另一個連接,因此關閉該連接並啟動該連接需要花費時間?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.