Я только что узнал, что большая часть потери производительности моего приложения связана с обработкой данных в наборе данных. DataTable:
- Установка значения, такого как dataset.DataTable [0] .row [0] [0] = значение занимает много времени. Операция set занимает гораздо больше, чем требуется, чтобы найти ячейку или вычислить значение.
- dataset.DataTable [0] .Columns.Contains ("name") также очень медленно. IndexOf имеет те же результаты, и ручной поиск «Столбцы» хуже.
есть идеи? (Я не могу перестать использовать DS, он слишком хорошо укоренен в приложении)
в большинстве случаев у меня есть 1 строка с 500+ столбцами и 200 или более вычисляемыми столбцами
private void AddComputedColumns()
{
Hashtable oldRowStatus = new Hashtable();
int i = m_RowCountBeforeNextRetrive;
for (i = m_RowCountBeforeNextRetrive; i < m_Data.Tables[0].Rows.Count; i++)
{
DataRow dr = m_Data.Tables[0].Rows[i];
oldRowStatus[dr.GetHashCode()] = new object[] { dr.RowState, dr.RowError };
}
// add the computed columns
if (m_BoComputedColumns.Count > 0)
{
foreach (AOColumn col in m_BoComputedColumns)
{
if (col.Value == null)
col.Value = DBNull.Value;
DataColumn dc;
if (m_RowCountBeforeNextRetrive == 0)
{
if (!m_Data.Tables[0].Columns.Contains(col.Name))
{
dc = m_Data.Tables[0].Columns.Add(col.Name, col.GetDataType());
dc.ReadOnly = false;
dc.ExtendedProperties.Add("IsComputed", true);
SetValueToComputedColumns(col, dc);
}
else
SetValueToComputedColumns(col, m_Data.Tables[0].Columns[col.Name]);
}
else
{
if (m_Data.Tables[0].Columns.Contains(col.Name))
SetValueToComputedColumns(col, m_Data.Tables[0].Columns[col.Name]);
}
}
}
for (i = m_RowCountBeforeNextRetrive; i < m_Data.Tables[0].Rows.Count; i++)
{
DataRow dr = m_Data.Tables[0].Rows[i];
object[] tmp = (object[])oldRowStatus[dr.GetHashCode()];
if ((DataRowState)tmp[0] == DataRowState.Unchanged && ((string)tmp[1]).Length == 0)
dr.AcceptChanges();
}
}
private void SetValueToComputedColumns(AOColumn col, DataColumn dc)
{
int i = m_RowCountBeforeNextRetrive;
for(i = m_RowCountBeforeNextRetrive; i < m_Data.Tables[0].Rows.Count; i++)
{
DataRow dr = m_Data.Tables[0].Rows[i];
dr[dc] = col.Value;
_syncedRowsList[i] = false;
}
}