Страница: 1 | 2 |
|
Вопрос: Как грамотно сохранить массив?
|
Добавлено: 11.06.06 10:54
|
|
Номер ответа: 17 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #17
|
Добавлено: 01.07.06 04:06
|
stopWatch.Start()
For Counter As Integer = 0 To 10000
ReDim Preserve arrayTest(Counter)
arrayTest(Counter) = random.Next(0, 254)
Next
Шедевр.
На каждой итерации, т.е. 10000 раз, выделаешь под массив по байту.
Я уверен, что функцию Redim Preserve не оптимизируется компилятором для того, чтоб она выделяла массиву большую размерность "про запас", отсюда имеем огромное падение производительности.
Вообще если решать первоначальную проблему, а не рассуждать о вреде использования Redim Preserve, то сохранять массив нужно напрямую в поток и загружать обратно , сама операция выделения памяти/записи/чтения займет меньше времени чем хитроумные операции с классами List и StringBuilder:
Option Strict On
Imports System.IO
Module Module1
Const size As Integer = 1000000
Sub Main()
Dim Size As Integer = 1000000
Dim Rnd As New Random
Dim Arr(Size - 1) As Byte
'Заполняем массив произвольными данными
Rnd.NextBytes(Arr)
' Записываем данные в файл
Using Stream As New FileStream("c:\1.txt", FileMode.Create, FileAccess.Write)
Stream.Write(Arr, 0, Size)
End Using
' Считываем данные из файла
Dim RecivedArr() As Byte
Using Stream As New FileStream("c:\1.txt", FileMode.Open, FileAccess.Read)
ReDim RecivedArr(CInt(Stream.Length) - 1)
Stream.Read(RecivedArr, 0, CInt(Stream.Length) - 1)
End Using
Console.ReadLine()
End Sub
End Module
Ответить
|
Номер ответа: 18 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #18
|
Добавлено: 01.07.06 11:59
|
На каждой итерации, т.е. 10000 раз, выделаешь под массив по байту.
Я уверен, что функцию Redim Preserve не оптимизируется компилятором для того, чтоб она выделяла массиву большую размерность "про запас", отсюда имеем огромное падение производительности
Ты думаешь Америку открыл? Если ты не заметил, то там есть такие строки:
Как правило,в большинстве случаев, размер массива заранее неизвестен, поэтому будем использовать инструкцию ReDim Preserve.
Р.S. Если заранее известен размер массива, то результаты практически одинаковые, даже массив оказывается немного быстрее..
А теперь, если тебе интересно, протестируй строковый массив .. скажем на 10000 строк и StringBuilder.. и увидишь разницу...
Ответить
|
Номер ответа: 19 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #19
|
Добавлено: 01.07.06 15:26
|
Ты думаешь Америку открыл? Если ты не заметил, то там есть такие строки:
Как правило,в большинстве случаев, размер массива заранее неизвестен, поэтому будем использовать инструкцию ReDim Preserve.
Р.S. Если заранее известен размер массива, то результаты практически одинаковые, даже массив оказывается немного быстрее..
Как ты думаешь, что представляет собой используемый тобою во втором примере класс List?
Связный список?
Внизу там лежит масив, и работает он быстрее чем массив в твоем первом примере потому что при полном заполнении этого массива его размер увеличивают не на 1, а на гораздо бОльшую величину.
При использовании обычного массива тебе никто не запрещает делать то же самое.
А теперь, если тебе интересно, протестируй строковый массив .. скажем на 10000 строк и StringBuilder.. и увидишь разницу...
Смысл сего деяния?
Конечно Array даст бОльшее быстродействие, я тебе могу это и без бенчмарков сказать.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму