我认为实际显示列表视图项目很慢,所以我进行了一些研究,发现将所有子项添加到数组中并使用Addrange比逐个添加项目要快得多。我实施了这个变化,但没有得到更好的速度。
然后,我在每行代码周围添加了一些秒表,以缩小导致减速的原因;毫不奇怪,调用datetime函数是最大的减速因素,但我惊讶地发现,string.format调用也非常慢,并且由于它们的数量,占据了大部分时间。
private void ProcessOrders(List<MyOrder> myOrders)
{
lvItems.Items.Clear();
marketInfo = new MarketInfo();
ListViewItem[] myItems = new ListViewItem[myOrders.Count];
string[] mySubItems = new string[8];
int counter = 0;
MarketInfo.GetTime();
CurrentTime = MarketInfo.CurrentTime;
DateTime OrderIssueDate = new DateTime();
foreach (MyOrder myOrder in myOrders)
{
string orderIsBuySell = "Buy";
if (!myOrder.IsBuyOrder)
orderIsBuySell = "Sell";
var listItem = new ListViewItem(orderIsBuySell);
mySubItems[0] = (myOrder.Name);
mySubItems[1] = (string.Format("{0:g}", myOrder.QuantityRemaining) + "/" + string.Format("{0:g}", myOrder.InitialQuantity));
mySubItems[2] = (string.Format("{0:f}", myOrder.Price));
mySubItems[3] = (myOrder.Local);
if (myOrder.IsBuyOrder)
{
if (myOrder.Range == -1)
mySubItems[4] = ("Local");
else
mySubItems[4] = (string.Format("{0:g}", myOrder.Range));
}
else
mySubItems[4] = ("N/A");
mySubItems[5] = (string.Format("{0:g}", myOrder.MinQuantityToBuy));
string IssueDateString = (myOrder.DateWhenIssued + " " + myOrder.TimeWhenIssued);
if (DateTime.TryParse(IssueDateString, out OrderIssueDate))
mySubItems[6] = (string.Format(MarketInfo.ParseTimeData(CurrentTime, OrderIssueDate, myOrder.Duration)));
else
mySubItems[6] = "Error getting date";
mySubItems[7] = (string.Format("{0:g}", myOrder.ID));
listItem.SubItems.AddRange(mySubItems);
myItems[counter] = listItem;
counter++;
}
lvItems.BeginUpdate();
lvItems.Items.AddRange(myItems.ToArray());
lvItems.EndUpdate();
}
这是一个样本运行的时间数据:
0: 166686
1: 264779
2: 273716
3: 136698
4: 587902
5: 368816
6: 955478
7: 128981 这些数字等于数组的索引。除此之外,其他所有行的滴答声都非常低,与这些相比可以忽略不计。
虽然我想使用string.format的数字格式化以获得漂亮的输出,但我更希望能够加载更多的订单列表,如果有一种替代方案比string.format更快但没有花哨的功能,那么我会全力支持它。
编辑:感谢所有建议myOrder类可能使用getter方法而不是存储变量的人。我检查了一下,确实是导致我的减速的原因。虽然我无法访问该类进行更改,但我能够依托于该方法调用来填充myOrders并在同一通话中将每个变量复制到列表中,然后在填充我的Listview时使用该列表。现在几乎瞬间就完成了填充。再次感谢。
String.Format()
会花费那么多时间,它应该是可以忽略不计的。我建议你仔细检查一下你的MarketInfo
方法调用。听起来你将要进行一些 I/O 操作,我怀疑这就是所有的减速来源。 - Jeff MercadoListView
操作是速度慢的原因。如果你注释掉与listItem
相关的行,你的函数会加速吗? - Gabe