Я надеялся получить совет о том, как ускорить следующую функцию.В частности, я надеюсь найти более быстрый способ преобразования чисел (в основном, удваивается, IIRC там есть один int) в строки для хранения в виде подэлементов Listview.В настоящее время эта функция обрабатывает 16 заказов за 9 секунд!Абсолютно безумный, особенно если учесть, что за исключением вызова обработки DateTimes, все это просто преобразование строк.
Я думал, что это было фактическое отображение элементов списка, которое было медленным, поэтому я провел некоторое исследование иобнаружил, что добавление всех подэлементов в массив и использование 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, могли бы использовать методы получения, а не хранить переменные, как я изначально думал.Я проверил это и, конечно же, это стало причиной моего замедления.Хотя у меня нет доступа к классу, чтобы изменить его, я смог добавить к вызову метода заполнение myOrders и скопировать каждую переменную в список в рамках того же вызова, а затем использовать этот список при заполнении моего ListView.Население почти мгновенно.Еще раз спасибо.