Оптимизация производительности для получения данных таблицы xml - PullRequest
0 голосов
/ 17 марта 2012

Я написал код, который делает то, что написано в заголовке.Проблема в том, что весь процесс занял 10 минут только для 1000 записей.Вот код: (Написано в vb.net 3.5 и sql server ce)

MyConnection.Open()
 Dim count As UInt32
 cmnd = New SqlCeCommand(sqlstring, MyConnection)
 cmnd.CommandType = CommandType.TableDirect
 myreader = cmnd.ExecuteResultSet(ResultSetOptions.Scrollable Or ResultSetOptions.Updatable)
 myreader.ReadLast()
 myreader.Read()
 Dim i As UInt16
 Do Until _TableItem(count) Is Nothing
     record = myreader.CreateRecord()
     For i = 0 To 20
         record.SetString(i, _TableItem(count + i).value())
     Next
     myreader.Insert(record)
     count += 21
 Loop
MyConnection.Close()

Как я могу оптимизировать этот код для повышения производительности?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Ну, хотя я сам это понял, я отвечаю на этот вопрос относительно других, застрявших в той же проблеме.

Решение, на самом деле, состоит в том, чтобы использовать для каждого и оператор выбора регистра (c # switch) вместо циклов do и for. Код будет выглядеть так:

For Each child as _TableItemChildNode in _TableItem
    Select Case count
        case 0
            record = myreader.CreateRecord()
            record.SetString(count, child.value())
            count += 1
        case 1 to 19
            record.SetString(count, child.value())
            count += 1
        case 20
            record.SetString(count, child.value())
            myreader.Insert(record)
            count = 0
    End Select
Next

Только смена кода сэкономила мне целых 7 минут. Обратите внимание, что по умолчанию этот процесс занимает много времени, поскольку записи внутри элементов очень велики.

0 голосов
/ 17 марта 2012

Вам нужно измерить и найти то, что занимает много времени.10 минут на 1000 предметов - это очень много времени, поэтому легко заметить проблему.Используйте класс секундомера для таких измерений.

Сначала попробуйте проверить, соответствует ли ваш код значению в записи - мера для 1-10-100-1000 записей.Я ожидаю, что вы обнаружите нелинейный рост времени (по крайней мере, O (n ^ 2)).

Измерьте создание на «записи» объектов отдельно от отправки данных в базу данных, т.е. просто удалив myReader.Insert).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...