Страница: 1 | 2 | 3 |
Вопрос: Небольшой тест скорости PB7 vs VB6
Добавлено: 29.03.05 19:07
Автор вопроса: Macronix | Web-сайт:
Ответы
Всего ответов: 44
Номер ответа: 31
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #31
Добавлено: 31.03.05 12:35
Cкоро будет готов твой аддон? Интересно было бы взглянуть... )
Номер ответа: 32
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #32
Добавлено: 31.03.05 13:58
Ну вообще по идее уже был готов (почти), но вчера вспомнил про Inline ассемблер и доделал списки для него. Рассусоливать с ним не хочется, поэтому по пробелу после ! выдаётся список всех мнемоник по документации интела, а по всем последующим пробелам - список регистров и прочей хрени.
Осталось так, по мелочи, ну и ввести ограничения на все операции кроме непосредственно самого набора текста.
Да, кто мне подскажет, на украинскую карточку VISA (банка Аваль) можно деньги из за границы переводить? Написано "Valid only in Ukraine", но мне говорят что это только использовать, а положить на счёт можно откуда хочешь. Так ли это?
Номер ответа: 33
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #33
Добавлено: 31.03.05 15:35
Пока тест клепал, тут уже флуда развели...
Вот, собсно, и код:
Для PB:
#COMPILE EXE
#REGISTER NONE
#DIM ALL
$LOGFILE = "pb_test.log"
$OPENLOGFILE = "notepad pb_test.log"
%THREAD_BASE_PRIORITY_LOWRT = 15
%REALTIME_PRIORITY_CLASS = &H00000100
MACRO lMax = 30000000&
MACRO TEST = SQR(SIN(RND) * 16)
DECLARE FUNCTION GetTickCount LIB "KERNEL32.DLL" ALIAS "GetTickCount" () AS LONG
DECLARE FUNCTION GetCurrentProcess LIB "KERNEL32.DLL" ALIAS "GetCurrentProcess" () AS LONG
DECLARE FUNCTION GetCurrentThread LIB "KERNEL32.DLL" ALIAS "GetCurrentThread" () AS DWORD
DECLARE FUNCTION SetPriorityClass LIB "KERNEL32.DLL" ALIAS "SetPriorityClass" (BYVAL hProcess AS DWORD, BYVAL dwPriorityClass AS DWORD) AS LONG
DECLARE FUNCTION SetThreadPriority LIB "KERNEL32.DLL" ALIAS "SetThreadPriority" (BYVAL hThread AS DWORD, BYVAL nPriority AS LONG) AS LONG
FUNCTION PBMAIN
REGISTER lRet AS LONG
REGISTER lTest AS LONG
REGISTER lTickCount AS LONG
LOCAL hThread AS LONG
LOCAL hProcess AS LONG
LOCAL sTemp AS STRING
'Set High Priority
hThread = GetCurrentThread : hProcess = GetCurrentProcess
CALL SetThreadPriority (hThread, %THREAD_BASE_PRIORITY_LOWRT)
CALL SetPriorityClass (hProcess, %REALTIME_PRIORITY_CLASS)
sTemp = "PowerBasic Loop Test. Count:" & STR$(lMAX) & $CRLF
RANDOMIZE TIMER
lTickCount = GetTickCount
Start:
lRet = TEST
INCR lTest
IF lTest <> lMAX THEN GOTO Start:
sTemp = sTemp & "Test: IF...GOTO >" & STR$(GetTickCount - lTickCount) & " ms" & $CRLF
lTickCount = GetTickCount
lTest = 0
DO WHILE lTest < lMAX
lRet = TEST
INCR lTest : LOOP
sTemp = sTemp & "Test: Do...Loop >" & STR$(GetTickCount - lTickCount) & " ms" & $CRLF
lTickCount = GetTickCount
lTest = 0
WHILE lTest < lMAX
lRet = TEST
INCR lTest : WEND
sTemp = sTemp & "Test: While...Wend >" & STR$(GetTickCount - lTickCount) & " ms" & $CRLF
lTickCount = GetTickCount
FOR lTest = 0& TO lMAX
lRet = TEST
NEXT lTest
sTemp = sTemp & "Test: For...Next+1 >" & STR$(GetTickCount - lTickCount) & " ms" & $CRLF
lTickCount = GetTickCount
FOR lTest = lMAX TO 0& STEP -1
lRet = TEST
NEXT lTest
sTemp = sTemp & "Test: For...Next-1 >" & STR$(GetTickCount - lTickCount) & " ms" & $CRLF
OPEN $LOGFILE FOR OUTPUT AS #1
PRINT #1, sTemp : CLOSE #1
SHELL($OPENLOGFILE)
END FUNCTION
Для VB:
Option Explicit
Const lMAX As Long = 30000000
Const LOGFILE As String = "vb_test.log"
Const OPENLOGFILE As String = "notepad vb_test.log"
Const THREAD_BASE_PRIORITY_LOWRT As Long = 15
Const REALTIME_PRIORITY_CLASS As Long = &H100
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess Lib "KERNEL32.DLL" () As Long
Private Declare Function GetCurrentThread Lib "KERNEL32.DLL" () As Long
Private Declare Function SetPriorityClass Lib "KERNEL32.DLL" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function SetThreadPriority Lib "KERNEL32.DLL" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Sub Form_Load()
Dim lRet As Long
Dim lTest As Long
Dim lTickCount As Long
Dim hThread As Long
Dim hProcess As Long
Dim sTemp As String
'Set High Priority
hThread = GetCurrentThread: hProcess = GetCurrentProcess
Call SetThreadPriority(hThread, THREAD_BASE_PRIORITY_LOWRT)
Call SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS)
sTemp = "VisualBasic Loop Test. Count:" & Str$(lMAX) & vbCrLf
Randomize Timer
lTickCount = GetTickCount
R:
lRet = TEST
lTest = lTest + 1
If lTest < lMAX Then GoTo R
sTemp = sTemp & "Test: IF...GOTO >" & Str$(GetTickCount - lTickCount) & " ms" & vbCrLf
lTickCount = GetTickCount
lTest = 0
Do While lTest < lMAX
lRet = TEST
lTest = lTest + 1: Loop
sTemp = sTemp & "Test: Do...Loop >" & Str$(GetTickCount - lTickCount) & " ms" & vbCrLf
lTickCount = GetTickCount
lTest = 0
While lTest < lMAX
lRet = TEST
lTest = lTest + 1: Wend
sTemp = sTemp & "Test: While...Wend >" & Str$(GetTickCount - lTickCount) & " ms" & vbCrLf
lTickCount = GetTickCount
For lTest = 0& To lMAX
lRet = TEST
Next lTest
sTemp = sTemp & "Test: For...Next+1 >" & Str$(GetTickCount - lTickCount) & " ms" & vbCrLf
lTickCount = GetTickCount
For lTest = lMAX To 0& Step -1
lRet = TEST
Next lTest
sTemp = sTemp & "Test: For...Next-1 >" & Str$(GetTickCount - lTickCount) & " ms" & vbCrLf
Open LOGFILE For Output As #1
Print #1, sTemp: Close #1
Shell (OPENLOGFILE)
End Sub
Private Function TEST() As Long
TEST = Sqr(Sin(Rnd) * 16)
End Function
И вот результаты:
[img]http://www.shared.vstd.ru//images/PB_VB_TEST.gif[/img]
Номер ответа: 34
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #34
Добавлено: 31.03.05 16:02
#REGISTER NONE
Прикольно Ты хоть представление имеешь для чего это нужно? Или просто для красоты вставил?
Я ухахатываюсь
#REGISTER NONE
REGISTER lRet AS LONG
И что тебе это даст?
Кстати, а что это за цифры у тебя в тестах. Что они означают, есть расшифровка?
Номер ответа: 35
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #35
Добавлено: 31.03.05 16:06
Кстати, в мануале по PB написано что его исполняемый код работает в 3-30 раз быстрее чем код VB6.
Номер ответа: 36
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #36
Добавлено: 31.03.05 16:13
Я понимаю, на VbSreet's не прижился PB, но зачем перекладывать с больной головы на здоровую?
Есть язык для начинающих - VB и для профессионалов - PB. Смотри по задаче, которая тебе нужна, и выбери инструмент по своему уровню.
Номер ответа: 37
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #37
Добавлено: 31.03.05 18:07
Не пойму, CyRax, что ты пытаешся доказать.
Что PB круче VB? Так они для разных целей.
Твой смех неуместен. Ты английский язык читать умеешь?
#REGISTER NONE disables automatic assignment of Register variables. You can still use the REGISTER statement to explicitly define Register variables in your code on an individual basis. This provides a way to hand-optimize your code to help obtain the utmost performance.
На счет таблицы, ты исходник внимательно смотрел? Запускал у себя? Если еще не понял, это время в милисекундах для выполнения цикла.
И при чем здесь VbSreet's?
Номер ответа: 38
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #38
Добавлено: 12.04.05 12:30
Если кому интересно, результаты теста смотрим тут:
http://www.shared.vstd.ru/pbtest/index1.htm
Жду отзывов критиков и скептиков.
Номер ответа: 39
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #39
Добавлено: 12.04.05 14:24
РВ часть не смотрел, а про asm-тесты скажу, что это сплошные глупости, а не тест
P6:
! INC lTest
siRet = TEST
! CMP EAX, lTest
! JNE P6
Что в теле asm-цикла делает HLL макрос TEST ?
Хочешь сделать нормальный корректный тест - пиши реализацию SQR(SIN(RND) * 16) на ассеблере. Есть команды для сопроцессора, используй их. А этот тест к ассемблеру никакого отношения не имеет.
И пустой цикл делается так:
P2:
dec ecx
jnz P2
И для чего обнулять регистры eax, ecx, edx, ebx если тут же следует вызовы ф-ций, в т.ч. API, который изменяют содержимое регистров? Для лишнего понта что-ли?
То, что на графиках ассемблерный код оказывается самым медленным, даёт информацию о писавших код...
В общем, ерунду на VBStreets изобрели
Номер ответа: 40
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #40
Добавлено: 12.04.05 14:55
Дык, я ассемблер не знаю вообще.
так, поверхностно... (надо будет вплотную занятся)
На счет пустого ASM цикла, я так и сделал потом (почитал немного справочник), но уже после результатов, поэтому изменять не стал. А этот фрагмент я переписал у CyRax-а.
Я только не могу понять, какое отношение к этому имеет VBStreets ???
Номер ответа: 41
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #41
Добавлено: 12.04.05 15:05
2 cresta
Где ты увидел что АSМ там оказался самым медленным? Почти везде самый быстрый.
Номер ответа: 42
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #42
Добавлено: 12.04.05 15:30
Сходи по своей ссылке, и посмотри второй и третий рисунок, которые с "непустым" циклом.
Если нормально сделать, то столбик нарисованный красным, должен быть значительно ниже, а он большей частью выше.
Номер ответа: 43
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #43
Добавлено: 12.04.05 15:44
Нормально это как? реализовать SQR(SIN(RND) * 16) на ассеблере? так я же говорил, что не знаю ASM так хорошо, как ты. Если есть время и желание, изобрази этот фрагмент и код выложи тут. Но это уже будут разные реализации алгоритма...
Вообщем так можно долго спорить.
P.S.
Интересно, процы от AMD показали определенный разброс в результатах и отработали в целом быстрее. А Интел сработал всё почти одинаково.
Номер ответа: 44
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #44
Добавлено: 12.04.05 17:34
Есть инструкции процессора fsin, fsqrt и т.д.
А то что AMD лучше, это не секрет, сама корпорация Интел признает факт, что сегодня AMD в целом превосходит Интел.