2010-06-27 4 views
4

Я только что получил код, переданный мне. Код написан на C#, и он вставляет данные в реальном времени в базу данных каждую секунду. Данные накапливаются во времени, что делает их большими.Как этот код может быть оптимизирован?

Данные обновляются в течение второго много раз, затем в конце второго результата берется и вставляется.

Мы использовали адреса строк данных непосредственно во второй части через свойства. Например, многие операции, такие как этот datavaluerow.meanvalue + = mean; может иметь место. , мы выяснили, что это ухудшает производительность после запуска профилировщика из-за внутреннего выполнения, поэтому мы создали 2-й массив десятичных знаков, на которых выполняются обновления, тогда значения присваиваются датарам только в конце второго. Я запустил профайлер и узнал, что он все еще занимает много времени (хотя время, затраченное на то, что время, когда оно было добавлено, часто обращалось к datarows).

код, который exectued в конце второго заключается в следующем

public void UpdateDataRows(int tick) 
{ 
    //ord 
    //_table1Values is of type decimal[][] 
    for (int i = 0; i < _table1Values.Length; i++) 
    { 
    _table1Values[i][(int)table1Enum.barDateTime] = tick; 
    table1Row[i].ItemArray = _table1Values[i].Cast<object>().ToArray(); 

    } 
    // this process is done for other 10 tables    
} 

Есть ли способ улучшить этот подход.

+0

Где ваше профилирование показывает больше всего времени? – Oded

+0

Внесите литье (int) table1Enum.barDateTime из цикла. –

+0

@ Одед, большую часть времени тратится на операцию литья – mustafabar

ответ

4

Один очевидный вопрос: почему у вас есть 2D массив десятичных знаков, когда вы только обновляете их целыми числами? Не могли бы вы уйти с int[][]?

Далее, почему вы получаете доступ к (int)table1Enum.barDateTime на каждой итерации? Учитывая, что там есть конверсия, вы можете найти may найти, если вы извлечете это из цикла.

Однако, я подозреваю, что большая часть времени будет потрачена на _table1Values[i].Cast<object>().ToArray(). Вам действительно нужно это делать? Получение копии decimal[] (или int[]) будет быстрее, чем бокс, каждое значение на каждой итерации при каждом вызове, а затем создание другого массива.

+0

Мы думаем об изменении десятичной точки в uint, и, конечно же, это улучшит использование памяти и производительность. однако время берется при отбрасывании десятичного на объект. ItemArray имеет объект типа. Как я могу обновить строки данных, не делая этого – mustafabar

+1

@Mustafa: Просто потому, что 'ItemArray' имеет тип' object', это не значит, что вы должны иметь массив объектов *. Любой массив - это сам объект. Имейте в виду, нужно ли брать копию массива, заметьте. –

+0

все еще копирование массива происходит в одно и то же время. Дело в том, что линия занимает примерно 20 мс, но мы повторяем этот процесс для других таблиц, которые заканчиваются примерно на 300 мс! задержка очень важна в наших данных. Я нашел этот процесс большим узким местом – mustafabar