Object

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

Object

Сообщение Debugger » 22.10.2010 (Пт) 22:17

Я был озадачен невысокой скоростью моего небольшого проекта, и решил найти медленные места. И с удивлением обнаружил, что функции и свойства переменных типа Object (Dim o As Object) вызываются невероятно медленно:
Код: Выделить всё
Const NOC As Long = 2000000
Const NOC2 As Long = 200000
......
    Dim t As Currency
    Dim cl As New cls   'Этот работает быстро
    Dim o As Object
    Set o = New cls     'А этот - медленно
    Dim c As Long
   
    Debug.Print "A"
    '========================1=========================
    t = Timer
    For c = 0 To NOC
        Prop2 = 200
    Next
    Debug.Print Timer - t
    '========================2=========================
    t = Timer
    For c = 0 To NOC
        cl.Prop = 200
    Next
    Debug.Print Timer - t
    '========================3=========================
    t = Timer
    For c = 0 To NOC
        o.Prop = 200
    Next
    Debug.Print Timer - t
    '========================4=========================
    t = Timer
    For c = 0 To NOC
        o.SetProp 200
    Next
    Debug.Print Timer - t
   


    Debug.Print "B"
    '========================1=========================
    t = Timer
    For c = 0 To NOC2
        TEST2 1, 2, 3, 4, 5, 6, 7, 8  'Просто функция-заглушка.
    Next
    Debug.Print Timer - t
    '========================2=========================
    t = Timer
    For c = 0 To NOC2
        cl.TEST 1, 2, 3, 4, 5, 6, 7, 8
    Next
    Debug.Print Timer - t
    '========================3=========================
    t = Timer
    For c = 0 To NOC2
        o.TEST 1, 2, 3, 4, 5, 6, 7, 8
    Next
    Debug.Print Timer - t

И результаты:
A
0,031 (просто переменная)
0,063 (Public переменная классса)
3,156 (Public переменная Object)
3,063 (Public Sub объекта)
B
0,109 (просто функция)
0,109 (функция класса - почти так же, как и просто функция)
0,547 (функция объекта - в 5 раз медленнее)

Никто не сталкивался с таким? Никто не знает, как заставить Object работать быстро?
Контекст задачи - есть несколько (6-10) типов объектов, причем у каждого типа свои характеристики. Самих объектов гораздо больше, чем типов.
Типы объектов я сделал как классы, объекты - As Object (каламбур). У всех типов объектов есть набор управляющих функций, при помощи которых я с ними взаимодействую (в примере - только Interact, на самом деле - Save, Load, Control, Collide, Spawn и кучка других).
Код: Выделить всё
Dim WObjects(4) As Object
WObjects(0)=New clsCube
WObjects(1)=New clsCube
WObjects(2)=New clsSphere
WObjects(3)=New clsSphere
WObjects(4)=New clsPlayer
For c=0 to 4
WObjects(c).Interact
....
Next

Я пытался делать это так: есть структурка (а-ля класс), в которой записаны адреса управляющих функций. Обломался на том, что не понял, как вызывать функции из модуля по адресу, а также на том, что у каждого объекта есть куча свойств, которые просто некуда вписать (в структуру? Неэкономно, да и куча разномастных полей в одной структуре не есть хорошо).
Предложите что-нибудь?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Object

Сообщение Хакер » 22.10.2010 (Пт) 22:19

Так, блин, используй интерфейсы, они для полиморфизма и созданы.

А Object — ещё бы ему быть не медленным. При каждом вызове метода вызывается IDispatch::GetIDsOfNames чтобы получить DispId, потом все аргументы метода преобразуются в массив Variant-ов, и вызывается Invoke. Как этому всему быть быстрым?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Object

Сообщение Debugger » 22.10.2010 (Пт) 22:46

Хакер писал(а):Так, блин, используй интерфейсы, они для полиморфизма и созданы.

Можно поподробней?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Object

Сообщение Хакер » 22.10.2010 (Пт) 22:47

Меня фразы «можно подробнее» ставят в тупик. Я на них могу ответить только одно: «Можно подробнее о том, что именно мне следует рассказать более подробно?»
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Object

Сообщение Debugger » 22.10.2010 (Пт) 23:14

А, всё, сообразил. Да, это должно помочь.
Спасибо!


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

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

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

    TopList