Можно как-нибудь оптимизировать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Можно как-нибудь оптимизировать?

Сообщение _NeoN_ » 15.10.2003 (Ср) 17:44

Вот написал модуль для работы с битами, вроде все работает, но это все должно работать предельно быстро, посмотрите как можно по скорости оптимизировать или это уже все...?
Вложения
Bits.zip
Модуль для работы с битами переменных
(652 байт) Скачиваний: 42

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 15.10.2003 (Ср) 18:44

Код: Выделить всё
Public Function BitGet(ByVal Variable As Long, ByVal BitNum As Byte) As Byte
    BitGet = Abs(CBool(Variable And 2 ^ BitNum))
End Function

Public Function BitSet(ByVal Variable As Long, ByVal BitNum As Byte) As Long
    BitSet = Variable Or 2 ^ BitNum
End Function

Public Function BitClear(ByVal Variable As Long, ByVal BitNum As Byte) As Long
    BitClear = Variable And Not (2 ^ BitNum)
End Function


Ха! Что любопытно, код BitClear() у меня компактнее, но твой работает быстрее (~ на 0.2 сек быстрее на милл. вызовов). Другие мои всё же быстрее.

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 15.10.2003 (Ср) 22:18

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

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 15.10.2003 (Ср) 23:35

Тут не в этом собака порылась. Возведение в степень, по крайней мере двойки, работает уже 100% быстрее чем цикл начиная с 4, а у нас диапазон 0-30, т.ч. возведение, в данном случае, статистически более выгодно.

Я думаю, это Not тормозит (проверка показала, что так оно и есть).

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 16.10.2003 (Чт) 15:29

Спасибо... чего-то я не подумал про возведение в степень.. :oops:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.10.2003 (Чт) 18:37

Кстати, можно существенно ускорить BitGet(), если возвращать не 0/1, а 0 и не 0
Код: Выделить всё
Public Function BitGet(ByVal Variable As Long, ByVal BitNum As Byte) As Byte
    BitGet = Variable And 2 ^ BitNum
End Function

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 16.10.2003 (Чт) 19:08

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

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 16.10.2003 (Чт) 19:55

Не мудрствуя лукаво.
Код: Выделить всё
Option Explicit

Public Function test()
   
    Dim i&, n&, t!
   
    n = 1000000
   
    t = Timer()
    For i = 1 To n
        Call routine_for_test_1(Parameters)
    Next
    Debug.Print Timer() - t
   
    t = Timer()
    For i = 1 To n
        Call routine_for_test_2(Parameters)
    Next
    Debug.Print Timer() - t
   
End Function


Делать надо просто на сколько это возможно, но не проще.
Сказал, кажется, А. Энштейн.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.10.2003 (Пт) 15:29

Второй вариант быстрее не на каждом процессоре, по крайней мере на K6-2 - медленнее. А вот так быстрее однозначно:
Код: Выделить всё
Dim SH(31) As Long

Public Sub Ini()
Dim n As Integer
  For n = 0 To 30
    SH(n) = 2 ^ n
  Next n
  SH(31) = &H80000000
End Sub

Public Function BG(ByVal Variable As Long, ByVal BitNum As Byte) As Byte
    BG = -CBool(Variable And SH(BitNum))
End Function

Public Function BS(ByVal Variable As Long, ByVal BitNum As Byte) As Long
    BS = Variable Or SH(BitNum)
End Function

Public Function BC(ByVal Variable As Long, ByVal BitNum As Byte) As Long
    BC = Variable And Not SH(BitNum)
End Function

но требует предварительной инициализации. Зато бит 31 тоже работает. Можно еще чуть-чуть ускорить BitClear, если задать для него свой массив (чтобы исключить NOT).

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 18.10.2003 (Сб) 18:38

Mikle писал(а):
Код: Выделить всё
Dim SH(31) As Long
...



Я полез в биты чтобы сэкономить память(сказали чтобы прога кушала как можно меньшк памяти), это получается 31 boolean переменная в 4 байтах(и умножить на 1000 потому что именно чтолько и будет это получается всего 4000 байт), а ты предлагаешь создать еще массив размером 32*4*1000=128000 байт :wink: :wink: ну а вообще я ничего насчет памяти не говорил...


Ладно всем спасибо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 9

    TopList  
cron