Доработал твой пример, взялся потому что испугал меня с Type'ом, я просто таким методом пользуюсь )

Global TestMassiv%[1000000],Tmp1%,Tmp2%,Tmp3%,bnkTest
For tm%=0 To 1000000
TestMassiv[tm%]=tm%
Next
Dim TestMassiv2(1000000)
For tm%=0 To 1000000
TestMassiv2(tm%)=tm%
Next
Global ttm%[3]
Type test
Field ID%
End Type
For tm%=0 To 1000000
tt.test = New test
tt\ID%=tm%
If tm%=500 Then ttm[1]=Handle tt
If tm%=5000 Then ttm[2]=Handle tt
If tm%=10000 Then ttm[3]=Handle tt
Next
bnkTest=CreateBank(5000000)
For tm%=0 To 1000000
PokeInt bnkTest,(tm%*4),tm%
Next
Repeat
If KeyHit(2) Then Test1()
If KeyHit(3) Then Test2()
If KeyHit(4) Then Test3()
If KeyHit(5) Then Test4()
If KeyHit(6) Then Test5()
Delay 1
If KeyHit(1)
FreeBank bnkTest
End
EndIf
Forever
Function Test1()
Local time%
time%=MilliSecs()
For tm%=0 To 1000000
;поправил массив - надо делать проверку, а не 10к раз присваивать значения
If TestMassiv[tm]=500 Then Tmp1%=TestMassiv[tm]
If TestMassiv[tm]=5000 Then Tmp2%=TestMassiv[tm]
If TestMassiv[tm]=10000 Then Tmp3%=TestMassiv[tm]
Next
time%=MilliSecs()-time%
Print time% + " = " + Tmp1 + " " + Tmp2 + " " + Tmp3
End Function
Function Test2()
Local time%
time%=MilliSecs()
For tm%=0 To 1000000
Tmp1%=TestMassiv2(500)
Tmp2%=TestMassiv2(5000)
Tmp3%=TestMassiv2(10000)
Next
time%=MilliSecs()-time%
Print time% + " = " + Tmp1 + " " + Tmp2 + " " + Tmp3
End Function
Function Test3() ;Если есть handle то не вижу смысла проходить по списку, а так мне форумчане советовали его реже использовать - медленный
Local time%
time%=MilliSecs()
p.test=Object.test(ttm[1])
Tmp1%=p\ID%
p.test=Object.test(ttm[2])
Tmp2%=p\ID%
p.test=Object.test(ttm[3])
Tmp3%=p\ID%
time%=MilliSecs()-time%
Print time% + " = " + Tmp1 + " " + Tmp2 + " " + Tmp3
End Function
Function Test4(); на 2 нолика меньше, ибо очень тупит)))
Local time%
time%=MilliSecs()
;For tm%=0 To 10000 ; убрал цикл т.к. 10к раз проходишь по миллионному списку 0_о
For p.test = Each test ;он и так пройдет по нему 1000000 раз
If p\ID%=500
Tmp1%=p\ID%
EndIf
If p\ID%=5000
Tmp2%=p\ID%
EndIf
If p\ID%=10000
Tmp3%=p\ID%
EndIf
Next
;Next
time%=MilliSecs()-time%
Print time% + " = " + Tmp1 + " " + Tmp2 + " " + Tmp3 ;результат требуемый
End Function
Function Test5() ;здесь тоже поправил, банк был всего на 10к байтов, как я понял проверяем на миллион )
Local time%
time%=MilliSecs()
For tm%=0 To 1000000 ;и сделал проверку, чтоб всё справедливо было как в списке и массиве
If PeekInt(bnkTest,tm)=500 Then Tmp1%=PeekInt(bnkTest,tm)
If PeekInt(bnkTest,tm)=5000 Then Tmp2%=PeekInt(bnkTest,tm)
If PeekInt(bnkTest,tm)=10000 Then Tmp3%=PeekInt(bnkTest,tm)
Next
time%=MilliSecs()-time%
Print time% + " = " + Tmp1 + " " + Tmp2 + " " + Tmp3
End Function
В итоге вышло: (проверка на миллион записей и мой слабенький бук)
Test1 -
133 мс - массив с квадратными скобками
Test2 -
135 мс - массив с круглыми скобками
Test3 -
0 мс - обращение к конкретным типам через object (если знаешь ссылку смысла нет гонять весь список, но вообще handle самый медленный)
Test4 -
146 мс (работал дико медленно потому что for..each и так проходит по всем записям (10к) а ты его в еще один цикл засунул 10к, в итоге сделал 100 миллионов проход, задолбался ждать ))
Test5 -
208 мс - проход по всей банке проигрывает