Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 | 3 |

 

  Вопрос: Небольшой тест скорости PB7 vs VB6 Добавлено: 29.03.05 19:07  

Автор вопроса:  Macronix | Web-сайт: http://x250.net/ | ICQ: 170650558 

Ответить

  Ответы Всего ответов: 44  

Номер ответа: 31
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #31 Добавлено: 31.03.05 12:35
а дома аддон для PBEdit пишу.


Cкоро будет готов твой аддон? Интересно было бы взглянуть... :))

Ответить

Номер ответа: 32
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #32
Добавлено: 31.03.05 13:58
 Ну вообще по идее уже был готов (почти), но вчера вспомнил про Inline ассемблер и доделал списки для него. Рассусоливать с ним не хочется, поэтому по пробелу после ! выдаётся список всех мнемоник по документации интела, а по всем последующим пробелам - список регистров и прочей хрени. :)
 Осталось так, по мелочи, ну и ввести ограничения на все операции кроме непосредственно самого набора текста.

Да, кто мне подскажет, на украинскую карточку VISA (банка Аваль) можно деньги из за границы переводить? Написано "Valid only in Ukraine", но мне говорят что это только использовать, а положить на счёт можно откуда хочешь. Так ли это?

Ответить

Номер ответа: 33
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #34
Добавлено: 31.03.05 16:02

#REGISTER NONE

 Прикольно :) Ты хоть представление имеешь для чего это нужно? Или просто для красоты вставил?

Я ухахатываюсь :)

#REGISTER NONE

REGISTER lRet       AS LONG

 И что тебе это даст?

Кстати, а что это за цифры у тебя в тестах. Что они означают, есть расшифровка?

Ответить

Номер ответа: 35
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #35
Добавлено: 31.03.05 16:06
Кстати, в мануале по PB написано что его исполняемый код работает в 3-30 раз быстрее чем код VB6.

Ответить

Номер ответа: 36
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #36
Добавлено: 31.03.05 16:13
 Я понимаю, на VbSreet's не прижился PB, но зачем перекладывать с больной головы на здоровую?
 Есть язык для начинающих - VB и для профессионалов - PB. Смотри по задаче, которая тебе нужна, и выбери инструмент по своему уровню.

Ответить

Номер ответа: 37
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #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-сайт: http://x250.net/
 Профиль | | #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-тесты скажу, что это сплошные глупости, а не тест

! MOV EAX, lMax
  P6:
! INC lTest
  siRet = TEST
! CMP EAX, lTest
! JNE P6


Что в теле asm-цикла делает HLL макрос TEST ?
Хочешь сделать нормальный корректный тест - пиши реализацию SQR(SIN(RND) * 16) на ассеблере. Есть команды для сопроцессора, используй их. А этот тест к ассемблеру никакого отношения не имеет.

И пустой цикл делается так:
mov ecx, lMax
  P2:
 dec ecx
 jnz P2


И для чего обнулять регистры eax, ecx, edx, ebx если тут же следует вызовы ф-ций, в т.ч. API, который изменяют содержимое регистров? Для лишнего понта что-ли?

То, что на графиках ассемблерный код оказывается самым медленным, даёт информацию о писавших код...
 
В общем, ерунду на VBStreets изобрели

Ответить

Номер ответа: 40
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #40
Добавлено: 12.04.05 14:55
Дык, я ассемблер не знаю вообще. :)
так, поверхностно... (надо будет вплотную занятся)
На счет пустого ASM цикла, я так и сделал потом (почитал немного справочник), но уже после результатов, поэтому изменять не стал. А этот фрагмент я переписал у CyRax-а.

Я только не могу понять, какое отношение к этому имеет VBStreets ???

Ответить

Номер ответа: 41
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #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-сайт: http://x250.net/
 Профиль | | #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 в целом превосходит Интел.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам