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