Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Как грамотно сохранить массив? Добавлено: 11.06.06 10:54  

Автор вопроса:  dr.Faust

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 16
Автор ответа:
 dr.Faust



Вопросов: 6
Ответов: 26
 Профиль | | #16 Добавлено: 19.06.06 14:04
Огромное человеческое спасибо!
Размер мне известен и потому коллекцию использовать не стал, а вот StringBuilder - это тема. Заменил & на StringBuilder.Append - выигрыш очевиден, не в разы но процентов на 30 быстрее. И про stopWatch я не знал - удобно, я для этого раньше опрашивал системный таймер.

Ответить

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам