Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Вопрос: Разгоняем CHR : Почти в 2 раза!
Добавлено: 08.05.05 22:08
Автор вопроса: Morpheus | Web-сайт:
Сразу извинюсь за немного кривоватый код, просто для демонстрации. Практика показывает, что если в циклах вместо CHR юзать массив символов, созданный той же ЧШР то выигрыш в скорости - почти 100%. Вот демо код. У меня показывает, что через массив в 1.99 раз быстрее :-/ А у кого как ещё?
Dim i As Long, j As Long
Dim t As Double
Dim s As String
Private Function TryChr()
s = ""
i = 0
j = 0
t = Timer
For i = 1 To 10000000
j = j + 1
If j = 256 Then j = 1
s = Chr(j)
Next
t = Timer - t
TryChr = t
End Function
Private Function TryC()
s = ""
i = 0
j = 0
t = Timer
For i = 1 To 10000000
j = j + 1
If j = 256 Then j = 1
s = c(j)
Next
t = Timer - t
TryC = t
End Function
Private Sub Form_Load()
Dim tmp1 As Double, tmp2 As Double, tmp3 As Double
InitF
tmp1 = TryChr
tmp2 = TryC
tmp3 = tmp1 / tmp2
MsgBox "Chr Method: " & tmp1 & vbNewLine & "C Method: " & tmp2 & vbNewLine & "Chr/C=" & tmp3
End Sub
Sub InitF()
Dim k As Integer
For k = 0 To 255
c(k) = Chr(k)
Next
End Sub
Ответы
Всего ответов: 125
Номер ответа: 1
Автор ответа:
AASoft
Вопросов: 86
Ответов: 920
Профиль | | #1
Добавлено: 09.05.05 01:43
hmm, i pravda... u menya v 1.76 raza...
nu a voobshe, ne tak uzh i chasto eto mozhet ponadobitsya...hotya neploho :D
Номер ответа: 2
Автор ответа:
admsasha
ICQ: 234002454
Вопросов: 56
Ответов: 69
Web-сайт:
Профиль | | #2
Добавлено: 09.05.05 04:47
Так у тебя получается, что то время которое ты тратишь в первом случае, не учитываешь. так что в самом коде программы, программа будет работать сколько же времени. Да и если любое значение функции запихать в массив она будет работать быстрее, так как уже не проходит весь цикл генерации ответа.
P.S. думаю кто нибуть понял, что я сказал )))
Номер ответа: 3
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #3
Добавлено: 09.05.05 07:34
2 admsasha:
Не знаю, я что то не всё понял
Ты этот неучтённый кусок кода имел в виду?
Dim k As Integer
For k = 0 To 255
c(k) = Chr(k)
Next
End Sub
просто я не думаю что на него уйдёт больше пары миллисекунд
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 09.05.05 10:41
Разве тут есть разгон chr? Ты сравниваешь время работы функции chr со временем доступа к элементу массива (ячейке памяти).
Та часть, которая Function TryChr() - так вообще-то не делается. Вычисления, повторяющиеся в цикле и дающие один и тот же результат, выносят из цикла, чтобы не гонять порожняком комп.
Предварительное создание таких таблиц готовых значений(в некоторых случаях даже не программно) - широко используемый приём, и на открытие Америки не тянет
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 09.05.05 10:59
Вы допустили ошибку, CHR быстрее массива. Этот код вам это объяснит:
Dim a(256) As String, i As Long, c As String, j As Long
Dim t1 As Single, t2 As Single, t3 As Single, t4 As Single
For i = 0 To 255
a(i) = Chr$(i)
Next
t1 = Timer
For j = 1 To 100000
For i = 0 To 255
c = Chr$(i)
Next
Next
t2 = Timer
For j = 1 To 100000
For i = 0 To 255
c = a(i)
Next
Next
t3 = Timer
For j = 1 To 100000
For i = 0 To 255
c = Chr(i)
Next
Next
t4 = Timer
MsgBox "CHR$ - " & CStr(t2 - t1) & vbCrLf & "Ìàññèâ - " & CStr(t3 - t2) & vbCrLf & "CHR - " & CStr(t4 - t3)
End Sub
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 09.05.05 13:38
Sharp
Сделай-ка
Next i
Next j
как положено, и посмотри, что быстрее ))
Номер ответа: 7
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #7
Добавлено: 09.05.05 13:43
Да, и не забудь откомпилировать свой пример, а то запуск из IDE - не очень удачная мысль.
Компилированный твой пример даёт такое:
CHR$ - 3.05
массив - 2.36
CHR - 4.04
Номер ответа: 8
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #8
Добавлено: 09.05.05 15:57
2 Sharp:
Я ещё когда дала свой первый переборщик паролей просёк выгоду массива и по замерам времени было гораздо быстрее. а в чём отличие твоего кода? (принципиальное)
Номер ответа: 9
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #9
Добавлено: 09.05.05 16:10
Отличие в том, что у тебя интервал 10000000 разбит на кусочки по 256, а у Sharpa - 100000 кусочков по 256.
Номер ответа: 10
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #10
Добавлено: 09.05.05 18:41
Next i
Next j
У Morpheus, тоже такого нет. А то что Next с указанием счетчика медленней - мы все и так знаем...
Номер ответа: 11
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #11
Добавлено: 09.05.05 19:23
Если не знаешь - лучше промолчи, не вводи в заблуждение людей.
Next i - это для порядка.
Что с указанием переменной цикла, что без указания - результат одинаковый для компилированного ехе. И не в пользу CHR$.
В какой пропорции - смотри выше.
Достаточно сделать Copy-Paste и откомпилировать, чтобы убедиться в этом и не делать голословных заявлений.
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 09.05.05 21:13
Next i - это для порядка.
В откомпилированном виде - да, но не в IDE. А то что для порядка - для этого существует форматирование кода. В те далекие времена когда код было принято набирать
20 RUN
Это было необходимо, но сейчас - это попросту лишнее. А в добавок ко всему и тормознутое. (IDE)
Номер ответа: 13
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #13
Добавлено: 09.05.05 21:51
Ссылки на IDE неуместны, так как программы работают не в IDE. Запуск в IDE, как я понимаю, нужен для проверки работоспособности и отладки программы.
А уж тем более сравнение скорости в IDE не делается.
Указание переменной цикла, на мой взгляд, является до некоторой степени признаком хорошего тона. Поэтому и последовало предложение указать её. Но не для того, чтобы получить выигрыш в скорости. А выигрыш в скорости достигается при переносе тестирования из IDE в реальные условия, где массив быстрее чем chr$ как с указанием переменной цикла, так и без неё.
Данный метод предварительного вычисления некоторых значений (или построения неких таблиц, массивов) широко используется именно с целью получения выигрыша в скорости, поэтому попытки опровергнуть это выглядят несколько странно.
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 10.05.05 01:17
Дурная у тебя привычка коверкать фразы и недопонимаючи лезть в спор.
Next j
как положено
Кем положено, уже все давно переиначено, и доказано что без аргумента работается приятней.
Нафиг мне с пеной у рта доказывать что доступ к элементам массива быстрее чем Chr...
При использоавнии Chr - взывается SysAllocStringLen + MultyByteToWideChar + FreeString
При использовании массива - SysAllocStringByteLen + FreeString
Юникод в BSTR требует жертв... и эта жертва - скорость...
Номер ответа: 15
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #15
Добавлено: 10.05.05 02:11
Насколько я помню, то в спор влез не я, а ты. Поэтому называй вещи своими именами.
И недопонимаючи ляпнул про медленность Next c указанием переменной цикла тоже ты. Поэтому не надо валить с больной головы на здоровую.
Похоже не протрезвел ещё с позавчерашнего