Searching in tbody and jump over not wished stocks improved performance

This commit is contained in:
2022-02-07 12:28:01 +01:00
parent 8b74067a10
commit b3d1a46c6c
8 changed files with 199 additions and 47 deletions

View File

@ -13,5 +13,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DataDomain\DataDomain.csproj" /> <ProjectReference Include="..\DataDomain\DataDomain.csproj" />
<ProjectReference Include="..\Helpers\Helpers.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,4 +1,5 @@
using DataDomain; using DataDomain;
using Helpers;
using OpenQA.Selenium; using OpenQA.Selenium;
using System; using System;
using System.Collections; using System.Collections;
@ -64,7 +65,7 @@ namespace BrowserHelper.Extensions
ColumnName = columns[colIndex].Text != "" ? ColumnName = columns[colIndex].Text != "" ?
columns[colIndex].Text : colIndex.ToString(), columns[colIndex].Text : colIndex.ToString(),
ColumnValue = colValue.Text, ColumnValue = colValue.Text,
ColumnSpecialValue = GetControl(colValue) //ColumnSpecialValue = GetControl(colValue)
}); });
} }
colIndex++; colIndex++;
@ -78,6 +79,46 @@ namespace BrowserHelper.Extensions
return tableDataCollection; return tableDataCollection;
} }
public static List<DiTraderStockRow> SimpleReadTablePartly(this IWebElement table, string[] shares, string[] shareHeaders)
{
var shareCollection = new List<DiTraderStockRow>();
var columns = table.FindElements(By.TagName("th"));
IWebElement tblBody = table.FindElement(By.XPath(".//tbody"));
var rows = tblBody.FindElements(By.TagName("tr"));
Dictionary<string, int> columnPos = new Dictionary<string, int>();
GlobalStopwatch.PrintSecs("After allocations");
for (int i = 0; i < columns.Count; i++)
{
if (shareHeaders.Contains(columns[i].Text)) columnPos.Add(columns[i].Text, i);
}
var antal = shares.Length;
int rowIndex = 0;
GlobalStopwatch.PrintSecs("Before scraplooping");
foreach (var row in rows)
{
var element = row.FindElement(By.XPath(".//td"));
if (!shares.Contains(element.Text)) { }
else
{
var colDatas = row.FindElements(By.TagName("td"));
if (colDatas.Count != 0 && shares.Contains(colDatas[0].Text))
{
shareCollection.Add(new DiTraderStockRow
{
StockName = colDatas[columnPos["Aktie"]].Text,
LatestPrice = decimal.Parse(colDatas[columnPos["Senast"]].Text),
TimeOfDay = TimeSpan.Parse(colDatas[columnPos["Tid"]].Text)
});
rowIndex++;
antal--;
}
}
if (antal < 1) break;
}
GlobalStopwatch.PrintSecs("After scraplooping");
return shareCollection;
}
private static ColumnSpecialValue GetControl(IWebElement columnValue) private static ColumnSpecialValue GetControl(IWebElement columnValue)
{ {
@ -131,45 +172,45 @@ namespace BrowserHelper.Extensions
} }
public static List<DiTraderStockRow> GetCertainStocks(this IWebElement element, string[] shares, string[] shareHeaders) //public static List<DiTraderStockRow> GetCertainStocks(this IWebElement element, string[] shares, string[] shareHeaders)
{ //{
List<DiTraderStockRow> shareList = new List<DiTraderStockRow>(); // List<DiTraderStockRow> shareList = new List<DiTraderStockRow>();
var reducedList = ReadTablePartly(element, shares, shareHeaders); // var reducedList = ReadTablePartly(element, shares, shareHeaders);
int rNr = -1; // int rNr = -1;
DiTraderStockRow Aktie = null; // DiTraderStockRow Aktie = null;
foreach (var shareRow in reducedList) // foreach (var shareRow in reducedList)
{ // {
if (shareRow.RowNumber != rNr) // if (shareRow.RowNumber != rNr)
{ // {
if (Aktie != null) // if (Aktie != null)
{ // {
shareList.Add(Aktie); // shareList.Add(Aktie);
} // }
Aktie = new(); // Aktie = new();
rNr = shareRow.RowNumber; // rNr = shareRow.RowNumber;
} // }
switch (shareRow.ColumnName) // switch (shareRow.ColumnName)
{ // {
case "Aktie": // case "Aktie":
{ // {
Aktie.StockName = shareRow.ColumnValue; // Aktie.StockName = shareRow.ColumnValue;
break; // break;
} // }
case "Senast": // case "Senast":
{ // {
Aktie.LatestPrice = Convert.ToDecimal(shareRow.ColumnValue); // Aktie.LatestPrice = Convert.ToDecimal(shareRow.ColumnValue);
break; // break;
} // }
case "Tid": // case "Tid":
{ // {
Aktie.TimeOfDay = TimeSpan.Parse(shareRow.ColumnValue); // Aktie.TimeOfDay = TimeSpan.Parse(shareRow.ColumnValue);
break; // break;
} // }
} // }
} // }
shareList.Add(Aktie); // shareList.Add(Aktie);
return shareList; // return shareList;
} //}
public static void PerformActionOnCell(this IWebElement element, string targetColumnIndex, string refColumnName, string refColumnValue, string controlToOperate = null) public static void PerformActionOnCell(this IWebElement element, string targetColumnIndex, string refColumnName, string refColumnValue, string controlToOperate = null)

100
Helpers/GlobalStopwatch.cs Normal file
View File

@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Helpers
{
public static class GlobalStopwatch
{
private static Stopwatch Stopwatch { get; set; }
static GlobalStopwatch()
{
Stopwatch = new Stopwatch();
}
public static void Start()
{
if (!Stopwatch.IsRunning)
{
_previousEllapsedMillis = 0;
Stopwatch.Start();
}
}
public static void Stop() => Stopwatch.Stop();
public static void Restart()
{
_previousEllapsedMillis = 0;
Stopwatch.Restart();
}
private static long _previousEllapsedMillis;
public static long EllapsedMillisPrevious
{
get
{
var ellapsed = EllapsedMillis;
var result = ellapsed - _previousEllapsedMillis;
_previousEllapsedMillis = ellapsed;
return result;
}
}
public static long EllapsedMillis => Stopwatch.ElapsedMilliseconds;
public static bool IsRunning
{
get
{
return Stopwatch.IsRunning;
}
}
public static void Print(string label)
{
if (label != null)
{
Debug.WriteLine($"{label}: {EllapsedMillis}");
}
else
{
Debug.WriteLine(EllapsedMillis);
}
}
public static void PrintWithLastTime(string label)
{
if (label != null)
{
Debug.WriteLine($"{label}: {EllapsedMillisPrevious}");
}
}
public static void PrintSecs(string label)
{
var secs = Math.Round((decimal)EllapsedMillis / 1000, 2);
if (label != null)
{
Debug.WriteLine($"{label}: {secs}");
}
else
{
Debug.WriteLine(secs);
}
}
public static void PrintWithLastTimeSecs(string label)
{
var secs = Math.Round((decimal)EllapsedMillisPrevious / 1000, 2);
if (label != null)
{
Debug.WriteLine($"{label}: {secs}");
}
}
}
}

View File

@ -17,6 +17,7 @@
<ProjectReference Include="..\BrowserHelper\BrowserHelper.csproj" /> <ProjectReference Include="..\BrowserHelper\BrowserHelper.csproj" />
<ProjectReference Include="..\DataDomain\DataDomain.csproj" /> <ProjectReference Include="..\DataDomain\DataDomain.csproj" />
<ProjectReference Include="..\DatamodelLibrary\DatamodelLibrary.csproj" /> <ProjectReference Include="..\DatamodelLibrary\DatamodelLibrary.csproj" />
<ProjectReference Include="..\Helpers\Helpers.csproj" />
<ProjectReference Include="..\StockDal.Interface\StockDAL.Interface.csproj" /> <ProjectReference Include="..\StockDal.Interface\StockDAL.Interface.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -14,6 +14,7 @@ using System.Diagnostics;
using StockDAL.Interface; using StockDAL.Interface;
using BrowserHelper.Driver; using BrowserHelper.Driver;
using BrowserHelper.Settings; using BrowserHelper.Settings;
using Helpers;
namespace StockDal namespace StockDal
{ {
@ -245,9 +246,10 @@ namespace StockDal
{ {
StockMarketList = new Dictionary<string, DiTraderStockRow>(); StockMarketList = new Dictionary<string, DiTraderStockRow>();
DumpObjects = new List<DiTraderStockRow>(); DumpObjects = new List<DiTraderStockRow>();
GlobalStopwatch.PrintSecs("After dictionaries setup ");
//var connStocks = _stockPersonConnect.GetAllConnectionsByPersId(persId); //var connStocks = _stockPersonConnect.GetAllConnectionsByPersId(persId);
var groupedStocks = _stockRepository.GetStocksGroupedPerPerson(persId); var groupedStocks = _stockRepository.GetStocksGroupedPerPerson(persId);
GlobalStopwatch.PrintSecs("After groupedStocks fetched ");
var lastGroup = string.Empty; var lastGroup = string.Empty;
var stockList = new List<string>(); var stockList = new List<string>();
@ -259,7 +261,9 @@ namespace StockDal
{ {
_testSettings.StockWishes = stockList.ToArray(); _testSettings.StockWishes = stockList.ToArray();
stockList.Clear(); stockList.Clear();
GlobalStopwatch.PrintSecs("Before GetStockStatus");
saveStockData( _scrapePage.GetMyStockStatus(lastGroup)); saveStockData( _scrapePage.GetMyStockStatus(lastGroup));
GlobalStopwatch.PrintSecs("After GetStockStatus");
lastGroup = groupedStock.StockGroup; lastGroup = groupedStock.StockGroup;
} }
else else

View File

@ -31,12 +31,8 @@ namespace StockDAL
{ {
Thread.Sleep(500); Thread.Sleep(500);
chooseList.SelectDropDownByText(listText); chooseList.SelectDropDownByText(listText);
Thread.Sleep(3000); Thread.Sleep(800);
var stockList = tblList.GetCertainStocks(_testSettings.StockWishes, _testSettings.StocWishCols); var stockList = tblList.SimpleReadTablePartly(_testSettings.StockWishes, _testSettings.StocWishCols);
//foreach (var stock in stockList)
//{
// Console.WriteLine($"Aktie: {stock.StockName} Senastepris: {stock.LatestPrice} TidPunkt {stock.TimeOfDay}");
//}
return stockList; return stockList;
} }

View File

@ -141,6 +141,10 @@ namespace StockInfoCore
private void btnValueView_Click(object sender, EventArgs e) private void btnValueView_Click(object sender, EventArgs e)
{ {
if(!GlobalStopwatch.IsRunning && GlobalStopwatch.EllapsedMillis>0)
GlobalStopwatch.Restart();
else GlobalStopwatch.Start();
if (SelectedPersonId == 0) if (SelectedPersonId == 0)
{ {
MessageBox.Show($"Ingen person vald ({SelectedPersonId})"); MessageBox.Show($"Ingen person vald ({SelectedPersonId})");
@ -155,6 +159,8 @@ namespace StockInfoCore
_stockWindow.Stocks = _stockMarketRepository.StockMarketList; _stockWindow.Stocks = _stockMarketRepository.StockMarketList;
Cursor.Current = DefaultCursor; Cursor.Current = DefaultCursor;
GlobalStopwatch.Stop();
GlobalStopwatch.PrintSecs("Before Show Stockwindow");
_stockWindow.ShowDialog(); _stockWindow.ShowDialog();
} }
} }

View File

@ -10,6 +10,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using StockDAL.Interface; using StockDAL.Interface;
using Helpers;
// //
namespace StockInfoCore namespace StockInfoCore
{ {
@ -72,6 +73,8 @@ namespace StockInfoCore
} }
lblOwnerName.Text = $"* {ConnectedPerson.FirstName} {ConnectedPerson.LastName} *"; lblOwnerName.Text = $"* {ConnectedPerson.FirstName} {ConnectedPerson.LastName} *";
GlobalStopwatch.PrintSecs("In reload (New window)");
txtBuyTotal.Text = BoughtSum.ToString(); txtBuyTotal.Text = BoughtSum.ToString();
txtBuyTotal.Refresh(); txtBuyTotal.Refresh();
txtCurrValue.Text = CurrentSum.ToString(); txtCurrValue.Text = CurrentSum.ToString();