Задача по оптимизации:

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Задача по оптимизации:

Сообщение zHackLeX » 17.04.2005 (Вс) 21:16

Дано: массив (ОГРОМНЫЙ)
R() As Byte
Одномерный.
RichTextBox1 aka Editor
Нужно:

Код: Выделить всё

Sub ReloadArray
    For i = 1 to UBound(R)
    tmp$ = tmp$ & Chr$(R(i))
    Next
    Editor.TextRTF = tmp$
End Sub




Можно ли ускорить процесс загрузки?
А то приходится иногда перекачивать файлы по полтора мега - все виснет минут на 15...
Пробовал CopyMemory - бесполезно...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.04.2005 (Вс) 21:21

Ищи проект (hCore, кажется) - быстрая работа с RichTextBox.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.04.2005 (Вс) 21:26

Вот оно.
Поможет, надеюсь?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.04.2005 (Пн) 10:44

zHackLeX
А если так:
Код: Выделить всё
Sub ReloadArray
    tmp$=space$(UBound(R))
    For i = 1 to UBound(R)
        mid$(tmp$,i,1) = Chr$(R(i))
    Next i
    Editor.TextRTF = tmp$
End Sub

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 18.04.2005 (Пн) 10:49

zHackLeX
Перед циклом вычисли размер массива и положи значение в переменную.
А саму переменную используй в массиве.

Код: Выделить всё

Dim arrMax As Long
Dim i As Long

arrMax=Ubound(R)

For i=1 to arrMax
'... ну и так далее



Иначе, если использовать в For вычисление размера массива Ubound() - при каждой итерации переменной i - происходит вычисление размера массива, вместо простого сравнения i с arrMax (но этот метод проявляет себя с хорошей стороны только именно на больших массивах). Ну например, если в массиве хранится около 5000-10000 сообщений и т.п.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.04.2005 (Пн) 10:57

Границы цикла вычисляются один раз, поэтому можно использовать любые выражения в качестве оных.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 18.04.2005 (Пн) 11:08

Ты файлы в байтовый массив грузишь с винта или получаешь откуда-то?

если с винта, то можно так:
Код: Выделить всё
RichTextBox1.LoadFile MyFile


а вообще для преобразования массива в строку и обратно лучше использовать это:
Код: Выделить всё
Public Function ArrayToString(SourceArray() As Byte) As String
  ArrayToString = StrConv(CStr(SourceArray), vbUnicode)
End Function

Public Function StringToArray(SourceString As String) As Byte()
  StringToArray = StrConv(SourceString, vbFromUnicode)
End Function


работает быстро. :D
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 18.04.2005 (Пн) 13:08

GSerg писал(а):Границы цикла вычисляются один раз, поэтому можно использовать любые выражения в качестве оных.

Т.е. если я сделаю так

Код: Выделить всё

Private R() As Long

Option Explicit


Private Sub Command1_Click()
    ReDim R(10)
    Dim i As Long
    For i = 1 To UBound(R)
        'где-то внутри цикла
        ReDim Preserve R(UBound(R) + 1)
        Debug.Print "Прошли " & i & "-й элемент массива"
    Next i
    Debug.Print "Новый размер массива= " & UBound(R)
End Sub


То цикл у меня закончится на старой границе массива? На той которая указана в объявлении цикла?

Только что проверил - точно, не пересчитывает.
Как-то не так получается... :roll:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 18.04.2005 (Пн) 13:46

Дело не в старой или новой границе массива, а в том что значение UBound(R) при каждой итерации переопределяется, так как это функция.

попробуй пустой цикл, только вместо UBound(R) поставь конкретное число и увидишь разницу во времени, если цикл конечно не до 1000.

:D
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.04.2005 (Пн) 14:06

Ещё раз - UBound вычисляется единожды.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.04.2005 (Пн) 14:09

Не UBound :)
Границы цикла FOR...NEXT вычисляются только один раз, при инициализации цикла. Счетчик же цикла может меняться. Проверка на достижение счетчиком конечного значения делается вроде бы на FOR (и, соответственно, на NEXT идет только приращение).
Если нужен цикл с "плавающими" границами, то тут только искуственные циклы типа DO...LOOP.
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.04.2005 (Пн) 14:30

А тормоза здесь:
Код: Выделить всё
tmp$ = tmp$ & Chr$(R(i))

Строка постоянно меняет длину.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.04.2005 (Пн) 14:36

Да и ReDim при каждой итерации скорости не добавляет.
Лучше увеличивать массив с определенным шагом, подкорректировав его в конце.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 18.04.2005 (Пн) 14:49

alibek писал(а):Да и ReDim при каждой итерации скорости не добавляет.
Лучше увеличивать массив с определенным шагом, подкорректировав его в конце.

Да это и понятно. :) ReDim я специально зарядил в цикл. Думал, что если граница цикла будет вычисляться при каждой итерации, то цикл получится бесконечным. Ан нет... Кончился на десятке. :)

Но ведь где-то же или читал, или сказал кто-то что вычисляется, вот не проверив и ляпнул. :oops:
Но всё равно, в любом случае я использую переменную вместо Ubound
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.04.2005 (Пн) 15:05

Ruslan Demidow писал(а):Но ведь где-то же или читал, или сказал кто-то что вычисляется, вот не проверив и ляпнул. :oops:
Но всё равно, в любом случае я использую переменную вместо Ubound

В разных реализациях Бейсика бывает по разному. Поэтому хорошим тоном считается не использовать в границах цикла переменные, которые меняются внутри цикла.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.04.2005 (Пн) 15:20

А теперь - как проще:

Поищи классик StringBuilder (точнее аналог NET-овского класса) - или возьми приложенный (он несколько упрощен, но для данного случая вполне достаточен. И работай с ним, примерно так:

Код: Выделить всё
Dim s as StringBuilder

For i = 1 to UBound(R)
    s.Append Chr$(R(i))
Next

Debug.Print s


Применяй везде где требуется склейка большого количества строк...
Вложения
StringBuilder.rar
(715 байт) Скачиваний: 24
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 19.04.2005 (Вт) 20:52

Спасибо в гигабайт размером. :o

Файл у меня находится на диске, причём
в двоичном файле, где побайтно зашифрован
весь TextRTF.

Попробую со StringBuilder'ом

Хотя, кажется, припарка в том месте, где
строка передаётся в объект RichTextBox.
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 19.04.2005 (Вт) 21:44

Код: Выделить всё
  Private Sub Form_Load() 
    Dim a(5) As Byte
    a(0) = Asc("t")
    a(1) = Asc("e")
    a(2) = Asc("s")
    a(3) = Asc("t")
    Text1.Text = StrConv(a, vbUnicode)
  End Sub

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.04.2005 (Ср) 7:22

zHackLeX писал(а):Хотя, кажется, припарка в том месте, где
строка передаётся в объект RichTextBox.


Нет, просто при объединении строки

Код: Выделить всё
s = s & s1


Постоянно перераспределяется память. Из-за этого и тормоза.
В общем для твоего случая можно сделать еще так:

Код: Выделить всё
s = Space(Ubound(R)+1)
For i=0 To Ubound(R)
    Mid$(s, i+1, 1) = Chr$(R(i))
Next i
Editor.TextRTF = s


Принцип ясен?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 20.04.2005 (Ср) 16:16

Andrey Fedorov
Выше уже было, не реагируют. :lol:

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 24.04.2005 (Вс) 18:27

нет-нет, вполне даже реагируют!
Просто пока в процессе...
Шлифуется алгоритм декодирования,
определяю лимит для ключа шифрования и т. п.
Вот и выбираю - как быстрее.
Ведь переброс текста - дело второе...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 35

    TopList