DataTable и производительность - PullRequest
1 голос
/ 05 января 2012

Я только что узнал, что большая часть потери производительности моего приложения связана с обработкой данных в наборе данных. DataTable:

  1. Установка значения, такого как dataset.DataTable [0] .row [0] [0] = значение занимает много времени. Операция set занимает гораздо больше, чем требуется, чтобы найти ячейку или вычислить значение.
  2. 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;

        }
    }
...