forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Type Blitz, c++ и даже c#, Оо (http://forum.boolean.name/showthread.php?t=16736)

radiobutton 02.05.2012 05:50

Type Blitz, c++ и даже c#, Оо
 


Где то читал, что type в блитз это тоже самое что struct в с++.

Обсуждаем?:)

ffinder 02.05.2012 11:13

Ответ: Type Blitz, c++ и даже c#, Оо
 
а что именно ты хочешь обсудить?
в блице нету классов, нет указателей на функции, в блице type это структура в смысле Си (без плюсов) только еще добавлено автоматическое создание коллекции для хранения объектов (команды After, Before, Insert, Delete)

Gector 02.05.2012 13:02

Ответ: Type Blitz, c++ и даже c#, Оо
 
В пурике и то лучше.

Crayzi 09.07.2012 06:19

Ответ: Type Blitz, c++ и даже c#, Оо
 
Я тут коекакой эксперимент провел, ато очень интересно стало коечто, думаю тема какрас то что надо.
Код:

Global TestMassiv%[10000],Tmp1%,Tmp2%,Tmp3%,bnkTest
For tm%=0 To 10000
        TestMassiv[tm%]=tm%
Next
Dim TestMassiv2(10000)
For tm%=0 To 10000
        TestMassiv2(tm%)=tm%
Next

Global ttm%[3]
Type test
        Field ID%
;        Field RandNum%
End Type
For tm%=0 To 10000
        tt.test = New test
        tt\ID%=tm%
;        tt\RandNum=Rand(1,10000)
        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(20002)

For tm%=0 To 10000
        PokeInt bnkTest,(tm%*2),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
                Tmp1%=TestMassiv[500]
                Tmp2%=TestMassiv[5000]
                Tmp3%=TestMassiv[10000]
        Next
        time%=MilliSecs()-time%
        Print time%
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%
End Function

Function Test3()
        Local time%
        time%=MilliSecs()
        For tm%=0 To 1000000
                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%
        Next
        time%=MilliSecs()-time%
        Print time%
End Function

Function Test4(); на 2 нолика меньше, ибо очень тупит)))
        Local time%
        time%=MilliSecs()
        For tm%=0 To 10000
                For p.test = Each test
                        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%
End Function

Function Test5()
        Local time%
        time%=MilliSecs()
        For tm%=0 To 1000000
                Tmp1%=PeekInt(bnkTest,1000)
                Tmp2%=PeekInt(bnkTest,10000)
                Tmp3%=PeekInt(bnkTest,19998)
        Next
        time%=MilliSecs()-time%
        Print time%
End Function

Витоге вышло
Test1 - 7 мс - массив с квадратными скобками
Test2 - 7 мс - массив с круглыми скобками
Test3 - 77 мс - обращение к конкретным типам через object
Test4 - 1800 мс (притом что во 100 раз меньше повторов сделал, но имхо думаю невыгодный способ при большом количестве данных) - перечисление типов.....
Test5 - 22 мс - чтение с определенных мест банка

jimon 09.07.2012 13:01

Ответ: Type Blitz, c++ и даже c#, Оо
 
Вложений: 1
Crayzi
Вложение 17149

impersonalis 10.07.2012 00:57

Ответ: Type Blitz, c++ и даже c#, Оо
 
Скорость команд в Blitz3D

burovalex 21.07.2012 21:41

Ответ: Type Blitz, c++ и даже c#, Оо
 
Доработал твой пример, взялся потому что испугал меня с 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 мс - проход по всей банке проигрывает


Часовой пояс GMT +4, время: 00:23.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot