Быстродействие для хорошего программиста (имхо)критично ВСЕГДА!
ReDim Preserve, если тут, собрались такие знатоки коллекций, то может Ника, мне расскажет как в коллекции при вызове метода Add(item) изменяется ее размерность?
Ну раз ты настаиваешь - изволь послушать...
Если взглянуть декомпилятором на код этого метода то мы увидим следующее:
Public Sub Add(ByVal item As T)
If (Me._size = Me._items.Length) Then
Me.EnsureCapacity((Me._size + 1))
End If
Me._items(Me._size++) = item
Me._version += 1
End Sub
Private Sub EnsureCapacity(ByVal min As Integer)
If (Me._items.Length < min) Then
Dim num As Integer = IIf((Me._items.Length = 0), 4, (Me._items.Length * 2))
If (num < min) Then
num = min
End If
Me.Capacity = num
End If
End Sub
Глядя на строчку кода:
Dim num As Integer = IIf((Me._items.Length = 0), 4, (Me._items.Length * 2))
можно сделать вывод, что если коллекция пуста, то ее размер делается равным 4, в противном случае размер УДВАИВАЕТСЯ от текущего размера, но никак не увеличивается на 1 потому что операция перераспределения памяти довольно дорога!!! Надеюсь ЭТО остудит твой пыл и ты осознаешь, что был не прав!
P.S. учитель Ника, код в студию
Я бы с радостью это сделала и поучавствовала в Вашем споре, но я не использую VB, а код на C# на этом форуме не уместен. К тому же Steel Brand привел вполне достойный код.
З.Ы. От спора по поводу API я бы тебе тоже рекомендовала извиниться и отказаться - снова в лужу сядешь!
Ну и в доказательство слов Steel Branda сущность всего происходящего:
Public Property Capacity As Integer
Get
Return Me._items.Length
End Get
Set(ByVal value As Integer)
If (value <> Me._items.Length) Then
If (value < Me._size) Then
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity)
End If
If (value > 0) Then
Dim destinationArray As T() = New T(value - 1) {}
If (Me._size > 0) Then
Array.Copy(Me._items, 0, destinationArray, 0, Me._size)
End If
Me._items = destinationArray
Else
Me._items = List(Of T)._emptyArray
End If
End If
End Set
End Property
смотря что подразумевать по быстродействием, если скорость конкретного метода, согласен! но если речь идет о больших проектах, то если не разбивать код на логические единицы, то скорость дальнейшей отладки и внесения изменений буит стоять дороже, в $ эквиваленте! в своем первом примере я пытался показать как можно сделать, но не говорил что мой код самый оптимальный! и давайте вернемся к пользователю этого кода! если он использует его как "черный ящик", спору нет! что хотим то и колбасим внутри, добиваясь оптимальной производительности! но когда это только часть класса, то надо найти оптимальное соотношение «Ваше время»\»время выполнения метода»! вижу, тут собрались люди, которые не ценят свое время
смотря что подразумевать по быстродействием, если скорость конкретного метода, согласен!
Я подразумеваю под "быстродействием" именно "быстродействие", и не обязательно это скорость конкретного метода, скорее это общая ощущаемая скорость работы.
Можно также сказать что поразумевается скорость работы постоянно используемых методов - то есть если метод который используется редко будет выполняться 5-10 секунд, это не так критично, если же речь идет о методе, который используется постоянно и обрабатывает ощутимые объемы данных, то разница между оптимизированным кодом и неоптимизированным в "$ эквиваленте" будет очень большая и совсем не в пользу неоптимизированного кода!
но если речь идет о больших проектах, то если не разбивать код на логические единицы, то скорость дальнейшей отладки и внесения изменений буит стоять дороже, в $ эквиваленте!
О чем ты говоришь? Ты хоть раз видел "большой проект", не разбитый на "логические единицы"?
И мне не ясно как разбиение на "логические единицы" противоречит оптимизации кода и отсутствию банального дол****ства при написании кода?
в своем первом примере я пытался показать как можно сделать, но не говорил что мой код самый оптимальный!
Тебе же объяснили какие конкретные очень явные лаги будут в коде
Пойми, не всегда нужно писать как хочется! При написании кода нужно думать о том что он будет работать в реальных условиях и иногда бывает нужно потратить 10 минут хотя бы на чтение документации на метод вместо того чтоб писать откровенную лажу которую НЕЛЬЗЯ пускать в продакшн.
и давайте вернемся к пользователю этого кода! если он использует его как "черный ящик", спору нет! что хотим то и колбасим внутри, добиваясь оптимальной производительности!
Почитай что такое ООП и т.п. - и ты поймешь что большинство кода как раз и нужно писать и использовать как "черный ящик"
но когда это только часть класса, то надо найти оптимальное соотношение «Ваше время»\»время выполнения метода»! вижу, тут собрались люди, которые не ценят свое время
Ты можешь говорить что угодно, но никакого оправдания написанию полного г**вна вместо качественного кода ты не найдешь!
Я же тебе привел примеры - предложенный тобою вариант отрабатывает в 20 раз медленнее чем мой! Как ты будешь оправдывать то что пользователь фтыкает в монитор 3 минуты вместо 10 секунд? Что ты скажешь заказчику? "Ты нихрена не шаришь, а я человек который ценит свое время"?
незнаю как там шарпе, но в басике оно точно только на чтение
Блин, ну может уже хватит ерунду городить и откроешь наконец таки MSDN?
Public Overridable Property Capacity() As Integer
Member of System.Collections.ArrayList
Summary:
Gets or sets the number of elements that the System.Collections.ArrayList can contain.
Public Property Capacity() As Integer
Member of System.Collections.CollectionBase
Summary:
Gets or sets the number of elements that the System.Collections.CollectionBase can contain.
Public Property Capacity() As Integer
Member of System.Collections.Generic.List(Of T)
Summary:
Gets or sets the total number of elements the internal data structure can hold without resizing.
Public Overridable Property Capacity() As Integer
Member of System.Collections.SortedList
Summary:
Gets or sets the capacity of a System.Collections.SortedList object
то надо найти оптимальное соотношение «Ваше время»\»время выполнения метода»! вижу, тут собрались люди, которые не ценят свое время
А это уже вообще глупость.. Никакое соотношение не может служить оправданием кривизны кода. Как раз таки наоборот, я слишком ценю свое время чтобы писать такой убогий код, и потом удивляться: а почему он у меня работает 3 минуты вместо 9 секунд? И тратить "часы" на переписывание кода и его отладку отладку!
дорогие умники и умницы, в следующий раз когда кто-то что то спросит! вы сразу пишите ему 100% идеальный код! а не умничайте в конце 3-й страницы, что человек дал новичку один из алгоритмов решения его задачи! а что и как "оптимизировать это уже его проблема" почему-то не кто из вас двоих не выложил ни одного даже "медленого" примера! а начали потыкать автора в том, что он использует 32-х размерный массив!!! а искать оплошности в чужом коде, каждый может! но рас речь зашла уже о быстродействии! тогда марш все на ассемблер! иногда, в случаях, когда от тебя требуют мгновенной реакции, не до оптимизации! а писать что все до..ебы и их код говно! так тогда и мелкомягкие говно, так как их софт значительно уступает в производительности их конкурентов! но темнемение даже такие "знатоки" как вы пользуетесь их продуктами"!
Ты курнул или в школе не учился? Почему предложения начинаются с маленькой буквы а в конце каждого предложения восклицательный знак?
дорогие умники и умницы, в следующий раз когда кто-то что то спросит! вы сразу пишите ему 100% идеальный код! а не умничайте в конце 3-й страницы, что человек дал новичку один из алгоритмов решения его задачи! а что и как "оптимизировать это уже его проблема" почему-то не кто из вас двоих не выложил ни одного даже "медленого" примера!
Я ошибаюсь? Или я в этой теме уже написал больше кода чем написал по работе на прошлой неделе. Причем неплохо оптимизированные примеры.
а начали потыкать автора в том, что он использует 32-х размерный массив!!!
Exception of type 'System.OutOfMemoryException' was thrown.
Обьесните, пожалуйста, что ето может значить
Человек просил объяснить почему при объявлении 32-х мерного массива происходит исключение. Я это объяснил. Ответ полностью по теме.
Просто при дальнейшем рассуждении над этим вопросом меня догнало что такое реально 32-х мерный массив и я позволил себе пропустить еще несколько сообщений чтоб уберечь остальных испытателей от подобных экспериментов и кстати очень внятно объяснил почему они не будут работать.
а искать оплошности в чужом коде, каждый может!
Ну если каждый может, найди в моем коде оплошности, я с удовольствием их рассмотрю и приму во внимание. При этом не буду кидать в форум истерических сообщений с сотней восклицательных знаков.
но рас речь зашла уже о быстродействии! тогда марш все на ассемблер!
Хочешь еще один бенчмарк? Я не против, только с тем куском который я кинул в 22-м сообщении, потому что я за****ся писать тебе коды для бенчмарков, не получив ни одного твоего кода взамен. (Ты-то свое время ценишь, а вот мое похоже не очень)
Если же ты подумаешь головой то поймешь что на дисковых операциях ты ничего не выиграешь даже если напишешь на машинном коде.
иногда, в случаях, когда от тебя требуют мгновенной реакции, не до оптимизации!
Не поверишь - я дополнительно не занимался оптимизацией с кодом который я сюда кидал - я всегда так пишу.
Оптимизировать и мой код можно, но опять же - это дисковые операции, и вряд ли ты что-то сделаешь быстрее.
а писать что все до..ебы и их код говно!
Блин, ну это ж так и есть!
тогда и мелкомягкие говно, так как их софт значительно уступает в производительности их конкурентов!
Конкуренты Microsoft? КТО ОНИ??? ПОКАЖИ!
но темнемение даже такие "знатоки" как вы пользуетесь их продуктами"!
Я использую продукцию Microsoft потому что это на данный момент лучшая для меня продукция на рынке.
Но даже если ты пишешь на "говнософте от Microsoft", то опять же - это не оправдание того что ты пишешь отстойный код.
Короче мне твоя позиция ясна - ты понял что конкретно "просел" в технических вопросах и пытаешься слить тему на личные оскорбления, наезды и излюбленую тему "Microsoft мастдай", но делать этого не советую.
в следующий раз когда кто-то что то спросит! вы сразу пишите ему 100% идеальный код!
По возможности именно так и предпочитаю делаю, чтобы не краснеть за свой код.
человек дал новичку один из алгоритмов решения его задачи!
Не надо называть твой "код" алгоритмом, он этого не достоин.
А знаешь что самое страшное? Этот новичок рассчитывает на то, что ему дадут квалифицированный ответ, а вместо этого ему подсовывают откровенную лажу. Более того, он его по неопытности скопирует в свой проект, запустит, и будет 3 минуты "фтыкать в монитор".. а затем будет на всех форумах кричать, что NET - это лажа и тормоза! Но ему это пока простительно, он новичок.. Но ты то, по сравнению с ним, считаешь себя программистом!
но рас речь зашла уже о быстродействии! тогда марш все на ассемблер!
Не надо передергивать.. об ассемблере никто не говорил, речь идет исключительно о NET
а писать что все до..ебы и их код говно! так тогда и мелкомягкие говно
Т.е. ты себя и свой "код" сравниваешь с кодом MS???? Спасибо, насмешил...
День добрый, как и обещал вчера, я принес триммер с использованием FindFirstFile, FindNextFile api - функций, которые как подтверждает практика, работают гораздо шустрее. Статистика такая винт 360 гиг (RAID0), два логических раздела C,D 306423 файлов, время на сканирование 3,8 с. пример, который любезно нам предоставил Steel Brand 7,4c! Ну что господа вопросы будут? (коль разговор пошел о быстродействии)! оба проекта были скомпилированы, и запущены по 2 раза! дабы исключить влияния кэширования файловой системы! Код библиотеки ReadFile, специально инкапсулирован, дабы его «кривизну», не могли увидеть новечки! Всем желающим посмотреть его исходник, могу выслать на почту!
Пример Steel Brand
Function LoadAllFiles() As List(Of String)
 im result As New List(Of String)
‘ For Each Drive In DriveInfo.GetDrives
‘ If Drive.DriveType = DriveType.Fixed Then
‘ LoadFiles(Drive.RootDirectory.FullName, result)
‘ End If
’ Next
LoadFiles(“C:\”, result)
LoadFiles(“D:\”, result)
‘ диски прописаны статично, так как наличие сетевых дисков усложняет эту задачу
‘ при желании, можно включить и их, но картина не меняется
Return result
End Function
Sub LoadFiles(ByVal path As String, ByVal files As List(Of String))
Try
files.AddRange(IO.Directory.GetFiles(path))
For Each SubDirectory In IO.Directory.GetDirectories(path)
LoadFiles(SubDirectory, files)
Next
Catch ex As UnauthorizedAccessException
' все хорошо
End Try
End Sub
Sub Main()
 im start = Now
 im Files = LoadAllFiles()
Console.WriteLine(Now.Subtract(start))
End Sub
Мой пример
 im n As Integer
 im Files As Collections.Generic.List(Of String)
 im ReadFile As New clsFiles