Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

 

  Вопрос: Разгоняем CHR : Почти в 2 раза! Добавлено: 08.05.05 22:08  

Автор вопроса:  Morpheus | Web-сайт: xury.zx6.ru
Сразу извинюсь за немного кривоватый код, просто для демонстрации. Практика показывает, что если в циклах вместо CHR юзать массив символов, созданный той же ЧШР то выигрыш в скорости - почти 100%. Вот демо код. У меня показывает, что через массив в 1.99 раз быстрее :-/ А у кого как ещё?

Dim c(0 To 255) As String
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-сайт: dansoft.krasnokamensk.ru
 Профиль | | #2
Добавлено: 09.05.05 04:47
Так у тебя получается, что то время которое ты тратишь в первом случае, не учитываешь. так что в самом коде программы, программа будет работать сколько же времени. Да и если любое значение функции запихать в массив она будет работать быстрее, так как уже не проходит весь цикл генерации ответа.

P.S. думаю кто нибуть понял, что я сказал )))

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 09.05.05 07:34
2 admsasha:

Не знаю, я что то не всё понял :)
Ты этот неучтённый кусок кода имел в виду?

Sub InitF()
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-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 09.05.05 10:59
Вы допустили ошибку, CHR быстрее массива. Этот код вам это объяснит:
Private Sub Command1_Click()
    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-сайт: xury.zx6.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 09.05.05 21:13
Если не знаешь - лучше промолчи, не вводи в заблуждение людей.
Next i - это для порядка.

В откомпилированном виде - да, но не в IDE. А то что для порядка - для этого существует форматирование кода. В те далекие времена когда код было принято набирать

10 PRINT "HELLO WORLD"
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-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 10.05.05 01:17
Дурная у тебя привычка коверкать фразы и недопонимаючи лезть в спор.

Next i
Next j
как положено


Кем положено, уже все давно переиначено, и доказано что без аргумента работается приятней.
Нафиг мне с пеной у рта доказывать что доступ к элементам массива быстрее чем Chr...

При использоавнии Chr - взывается SysAllocStringLen + MultyByteToWideChar + FreeString

При использовании массива - SysAllocStringByteLen + FreeString

Юникод в BSTR требует жертв... и эта жертва - скорость...

Ответить

Номер ответа: 15
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #15 Добавлено: 10.05.05 02:11
Насколько я помню, то в спор влез не я, а ты. Поэтому называй вещи своими именами.
И недопонимаючи ляпнул про медленность Next c указанием переменной цикла тоже ты. Поэтому не надо валить с больной головы на здоровую.

Похоже не протрезвел ещё с позавчерашнего:(

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

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



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