Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скорость замены символа в строке. / 17 сообщений из 17, страница 1 из 1
19.08.2004, 22:35
    #32657895
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Нужно заменить в строковой переменной один символ на другой. Я здесь маленько написал. Вроде работает. Но когда доходит до 5000 замен, уж очень медленно все делается. Большие задержки по времени: 5000 замен - около 3-х секунд.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Option Explicit

 '*** ActiveX Control Event *** 
Private Sub Command1_Click()
Dim str1 As String
    str1$ = "П" & Chr$( 97 ) & "па + Мам" & Chr$( 97 )
    If InStr( 1 , str1$, Chr$( 97 )) Then
        str1$ = ReplSymbol(ByVal str1$, ByVal Chr$( 97 ), ByVal Chr$( 224 ))
    End If
    Debug.Print str1$
End Sub

 '/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
 '/* Заменяет в строке один символ на другой 
Private Function ReplSymbol(ByVal strConvert As String, ByVal strSymb1 As String, ByVal strSymb2 As String) As String
Dim i As Integer
    i =  1 
    Do While i <>  0 
        i = InStr(i, strConvert$, strSymb1$, vbTextCompare)
        If i <>  0  Then Mid$(strConvert$, i,  1 ) = strSymb2$
    Loop
    ReplSymbol$ = strConvert$
End Function
Может кто-нибудь что-то посоветует?
То, что можно сделать быстрее на VB это точно. У меня есть готовое приложение, где такие замены деляются менее одной секунды.
...
Рейтинг: 0 / 0
20.08.2004, 02:23
    #32657947
kalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Не знаю, подойдет ли тебе. Попробуй использовать функцию Replace.
...
Рейтинг: 0 / 0
20.08.2004, 08:19
    #32658028
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Ok. Не по глазам. Делаю то, что уже в VB есть!
...
Рейтинг: 0 / 0
20.08.2004, 09:39
    #32658127
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
МаксимВOk. Не по глазам. Делаю то, что уже в VB есть!
а replace в vb нет ?
...
Рейтинг: 0 / 0
20.08.2004, 10:55
    #32658338
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Здесь есть вариант самодельной функции Replace, работающей в ~12 раз быстрее стандартной.
...
Рейтинг: 0 / 0
20.08.2004, 12:07
    #32658615
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Ошибка вот где:
Код: plaintext
1.
2.
3.
...
If InStr([color=red] [b]1 [/color][/b], str1$, Chr$( 97 )) Then
...

Смотри, у тебя всегда поиск начинается с еденицы! А должен не начинатся с 1, а продолжатся с позиции в которой ты заменил последний символ.

Потому и замедляется, что строку он у тебя будет просматривать от начала до найденного символа немеренное количество раз! А должен только один проход от начала до конца делать.
...
Рейтинг: 0 / 0
20.08.2004, 16:50
    #32659592
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
MegaDimonОшибка вот где:

Смотри, у тебя всегда поиск начинается с еденицы! А должен не начинатся с 1, а продолжатся с позиции в которой ты заменил последний символ.


посмотри внимательней на код.

Всем спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.07.2006, 11:09
    #33832080
ba4inskii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Вопрос в дополнение!
А как заменить символ не на один символ, а на строку?
типа @ на ret_rus?

___________________________________________________
Система, не рассчитанная на идиота - идиотская система.
...
Рейтинг: 0 / 0
05.07.2006, 11:35
    #33832200
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Ответ в дополнение!
marvan Здесь есть вариант самодельной функции Replace, работающей в ~12 раз быстрее стандартной.
...
Рейтинг: 0 / 0
05.07.2006, 12:00
    #33832321
ba4inskii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
marvanОтвет в дополнение!
marvan Здесь есть вариант самодельной функции Replace, работающей в ~12 раз быстрее стандартной.

marvan Вы бы не могли ткнуть меня носов именно в то, что мне нужно по этой ссылке?)
У меня с англицким пока проблемы ((
...
Рейтинг: 0 / 0
05.07.2006, 14:03
    #33832788
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
например
Добавить в проект класс clsReplace, добавить в него вышеуказанный код и далее в нужном месте программы вызываем:
Код: plaintext
1.
2.
3.
4.
    Dim r As New clsReplace
    Dim s As String
    s = "aaaaa@aaa aaaaa@aaaaaaa"
    s = r.Replace10(s, "@", "ret_rus")
    'Debug.Print s
...
Рейтинг: 0 / 0
05.07.2006, 16:01
    #33833318
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
marvan Здесь есть вариант самодельной функции Replace, работающей в ~12 раз быстрее стандартной.Я проверял эту функцию. Сандартная быстрее. Правда проверял только в ide, может скомпилированная быстрее.
...
Рейтинг: 0 / 0
05.07.2006, 16:18
    #33833399
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Проверил еще раз. Скорость зависит от того что на что заменяешь. Вот тест:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub Command1_Click()
Dim t
Dim s As String, r As String
Dim x As Long
Dim c As clsReplace
    Set c = New clsReplace
    t = Timer
    For x =  1  To  1000 
        s = Space( 1000 )
        r = Replace(s, " ", "x")
    Next x
    Debug.Print Timer - t
    t = Timer
    For x =  1  To  1000 
        s = Space( 1000 )
        r = c.Replace11(s, " ", "x")
    Next x
    Debug.Print Timer - t
    Debug.Print
End Sub
Результаты - 1,171875 стандартный против 0,65625 альтернативный.
Если пробел заменять на "xx", то 1,171875 против 1,265625 соответственно.
"ххх" дает 1,171875 (опять таки!) и 1,421875
...
Рейтинг: 0 / 0
05.07.2006, 16:30
    #33833464
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Резолюция такая: если длина результирующей строки после замены будет отличаться от исходной или заменяются длинные подстроки - используй стандартный Replace.

Фактически альтернативный выйграл только в первом тесте - замена одного символа на один.
...
Рейтинг: 0 / 0
05.07.2006, 16:40
    #33833500
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public Sub Test1()
    Dim r As New clsReplace
    Dim s As String
    Dim o As String
    Dim i As Long
    For i =  1  To  1000 
        s = s & "aaaaa@aaa aaaaa@aaaaaaa"
    Next
    For i =  1  To  1000 
        o = r.Replace10(s, "@", "ret_rus")
    Next
End Sub

Public Sub Test2()
    Dim s As String
    Dim o As String
    Dim i As Long
    s = "aaaaa@aaa aaaaa@aaaaaaa"
    For i =  1  To  1000 
        s = s & "aaaaa@aaa aaaaa@aaaaaaa"
    Next
    For i =  1  To  1000 
        o = Replace(s, "@", "ret_rus")
    Next
End Sub

IDE - ради спортивного интереса
11,4696 - Replace10
2,2387 - ReplaceVB
EXE - выигрыш альтернативной функции
0,7092 - Replace10
2,2815 - ReplaceVB

2 Antonariy
ради чего проверки затевать?
там ведь таблица есть, где приводятся результаты множества тестов.
и ни где стандартный Replace не выиграл.
...
Рейтинг: 0 / 0
05.07.2006, 16:57
    #33833558
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
На заборах тоже таблицы бывают. Лишняя проверка никода не помешает. Действительно, альтернативный Replace в скомпилированном виде рулит.))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.11.2007, 12:58
    #34918551
Guest_06-11-07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость замены символа в строке.
Код: plaintext
Private saDst As bstrapi.SAFEARRAY1D
а откуда этот тип данных брать?
а то Replace11 без него никак.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скорость замены символа в строке. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]