Страницы: Пред. 1 2
RSS
Заполнение словаря только ключами. Какой вариант лучше?
 
Цитата
Евгений Смирнов написал:
основные запомнил
Через 25 лет проверим!
Изменено: sokol92 - 03.12.2021 19:45:24
Владимир
 
Jack Famous, уфф, нашёл это использование у ZVI. Тема от Января 2011 года
Скачай Excel файл из сообщения №21 от ZVI в этой теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=21594

а в этой теме Hugo использует https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=42447

Но в WinAPI это повсеместно используется и в константах и в аргументах функций, например,
Код
result = URLDownloadToFile(0&, UrlFileName, DestinationFileName, 0&, 0&)
Call PlaySound(WAVFile, 0&, SND_ASYNC Or SND_FILENAME)
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
SHCreateDirectoryEx ByVal 0&, StrPtr(sPath), ByVal 0&
Ret = SendMessage(hWndOK, BM_CLICK, 0, ByVal 0&)
Private Const WM_CLOSE As Long = 0&

просто 0 VBA присваивает тип Integer, а 0& VBA присваивает тип Long
Код
? Typename(0)
Integer
? Typename(0&)
Long

sokol92, да, ты прав, для VBA 0& эквивалентно CLng(0)

вот код из того файла ZVI. Я же говорю, что у ZVI научился ))

Код
Option Explicit

' Структура для QSortNonRecursive()
Private Type QStack
    Low As Long
    High As Long
End Type

' ZVI:2011-01-07 http://www.planetaexcel.ru/forum.php?thread_id=23032
' Функция выдает отсортированный массив уникальных значений диапазона Rng
' Аргументы фeкнкции:
'   Rng       - диапазон обрабатываемых значений
'   RowOffset - количество строк отступа сверху диапазона для пропуска заголовков и т.п.
'   MinLength - минимально допустимая длина значения, если меньше, то пропускается
Function FastNoDups(Rng As Range, Optional RowOffset&, Optional ByVal MinLength& = 1)
    Dim a(), k$, x
    If MinLength = 0 Then MinLength = 1
    With CreateObject("Scripting.Dictionary")
        For Each x In Intersect(Rng.Resize(Rng.Rows.Count - RowOffset).Offset(RowOffset), Rng.Parent.UsedRange).Value
            k = Trim(x)
            If Len(k) >= MinLength Then .Item(k) = 0&
        Next
        a() = .Keys
        QSortNonRecursive a()
    End With
    FastNoDups = a
End Function

' Быстрая сортировка массива, см.: http://www.planetaexcel.ru/forum.php?thread_id=7702
Private Sub QSortNonRecursive(Arr())
    Dim i&, j&, LB&, UB&, StPtr&, Ptr&, Pvt, Swp
    Dim St() As QStack
    ReDim St(1 To 64)
    StPtr = 1
    St(1).Low = LBound(Arr)
    St(1).High = UBound(Arr)
    Do
        LB = St(StPtr).Low
        UB = St(StPtr).High
        StPtr = StPtr - 1
        Do
            Ptr = (LB + UB) \ 2
            i = LB: j = UB: Pvt = Arr(Ptr)
            Do
                While Arr(i) < Pvt: i = i + 1: Wend
                While Pvt < Arr(j): j = j - 1: Wend
                If i <= j Then
                    Swp = Arr(i): Arr(i) = Arr(j): Arr(j) = Swp
                    i = i + 1
                    j = j - 1
                End If
            Loop While i <= j
            If i < Ptr Then
                If i < UB Then
                    StPtr = StPtr + 1
                    If StPtr > UBound(St) Then ReDim Preserve St(1 To UBound(St) * 2)
                    St(StPtr).Low = i
                    St(StPtr).High = UB
                End If
                UB = j
            Else
                If j > LB Then
                    StPtr = StPtr + 1
                    If StPtr > UBound(St) Then ReDim Preserve St(1 To UBound(St) * 2)
                    St(StPtr).Low = LB
                    St(StPtr).High = j
                End If
                LB = i
            End If
        Loop While LB < UB
    Loop While StPtr
End Sub
Изменено: New - 03.12.2021 20:28:08
 
New
Цитата
просто 0 VBA присваивает тип Integer, а 0& VBA присваивает тип Long
А зачем в нашем случае чтобы 0 был Long. Будет больше памяти занимать Как объяснил Щербаков в сообщении 8 и я с ним согласен.
 
Так можно использовать вместо  простого 0, который VBA автоматически конвертирует в Integer писать CByte(0). Тогда компьютер будет выделять по 1 байту вместо 2 байт у Integer и 4 байт у Long
Просто уже никто не следит за этим, так как сейчас на компах гигабайты оперативной памяти. Замени 0 на cbyte(0) в тестах и посмотри. Мне кажется, что разницы не будет большой
Изменено: New - 04.12.2021 04:20:00
 
New Доброе утро по крайней мере у меня, а вы совсем не спите
Согласен, что теперь это уже не очень актуально тк памяти в компах достаточно. Писать cbyte(0) наверно нет смысла, но и Long наверно не надо. Раз по умолчанию в VBA integer пусть он и остается
Изменено: Евгений Смирнов - 04.12.2021 04:29:46
 
Доброе утро, Мне кажется 0 будет быстрее обрабатываться, чем 2 кавычки "". Это я про ваш 3й вариант
P.S. извините, если с кем-то не здороваюсь, для меня мы не прощаемся и постоянно видим друг друга))
Изменено: New - 04.12.2021 05:09:55
 
New Открыл книгу Уокенбаха строки бывают фиксированной и переменной длины. В 3 варианте скорее всего переменная длина. В книге написано она занимает 10байт+ 1байт  на каждый символ. В таком случае и по объему и скорости будет хуже. А вот если там использовать строку фиксированной длины(1символ 1байт) с любым символом ANSI(однобайтным), то наверно разницы не будет.
Изменено: Евгений Смирнов - 04.12.2021 05:33:00
 
Ну, 2 кавычки это строка нулевой длины. Просто компьютер быстрее обрабатывает числа, чем строки, даже нулевой длины
 
New Согласен. Только я не знаю сколько в памяти строка 0 длины занимает.и сколько в памяти занимает значение Empty. Знаю что после инициализации переменной типа Variant она заполняется Empty.
 
Игнорируя полемику о сбережении памяти:
Писать 0& или CByte(0) и т.д. - не имеет никакого смысла (в первую очередь по скорости), если речь не про WinAPI, у которой свои заморочки и она просто не заработает по-другому
Верно?
Надо отдельную тему сделать, наверное, и затестить...
Я думаю, что будет незначительно медленнее, потому что это обёртка или также, как простой 0
Изменено: Jack Famous - 04.12.2021 11:08:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Верно?
думаю, да
 
New, спасибо)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Какой вариант лучше?
если так сильно интересно, то лучше взять и самому протестировать - это заняло бы 15-30 минут
а простой ответ на поставленный вопрос мог бы звучать так:
1. вот такой способ быстрее
2. вот такой способ занимает меньше памяти

лично у меня нет ответов (потому что мне это не интересно, облом потратить эти 15-30 минут на выяснение)
и извините (особенно те, кто дочитал до этого сообщения, но так и не увидел ответов на два простых вопроса)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: Пред. 1 2
Наверх