powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / StringBuffer
12 сообщений из 12, страница 1 из 1
StringBuffer
    #32128075
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотелось бы какой нибудь буффер для строк:
т.к при раскрутке рекордсета и формировании xml используется много конкатенаций, к-рые хотелось бы ускорить
...
Рейтинг: 0 / 0
StringBuffer
    #32128098
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понял вопрос, то:

Const Buffer As Long = 256
Dim str As String * Buffer
Debug.Print str

Тока оперировать потом надо с помщью Mid$, а не конкатенции (+,&)
...
Рейтинг: 0 / 0
StringBuffer
    #32128123
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотелось бы что то вроде жабного StringBuffer, т.е.

StringBuffer buffer = new StringBuffer("<some>");

while (rs.next) {
buffer.append( rs.getString("field") );
}

buffer.append("</some>");
System.out.println( buffer.toString() );

я думал в Scripting есть, но там только TextStream... :(
Вопрос усложняется тем, что это ASP (не .NET)
на самом деле происходит следующее

Dim l_sString
l_sString = "<some>"
while not l_oRs.EOF
' 1:
l_sString = l_sString & Cstr(l_oRs.Fields("field").value)
l_oRs.moveNext
wend

l_sString = l_sString & "</some>"

операция сложения 1: занимает кучу времени. какой нибудь буффер или Stream очень сильно бы помог. но он должен быть в стандартной поставке, т.е. никакой самодеятельности с com объектами...

если я его не найду, то я проиграю спор что жаба медленее васика, и в продукте придется возиться с самописанным вебсервером на жабе и SOAP, а этого хотелось бы избежать...
...
Рейтинг: 0 / 0
StringBuffer
    #32128144
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тебе в форум по VB и ASP .Net надо.
...
Рейтинг: 0 / 0
StringBuffer
    #32128153
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
виктор, я не использую .NET
это обычный ASP
или же VB
...
Рейтинг: 0 / 0
StringBuffer
    #32128193
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я неиспользую и обычного ASP. Просто подумал что конструкция System.out.println( buffer.toString() ); это от туда

Все-таки попробуй использовать функцию Mid. В рекомендациях по увеличению быстродействия именно так и рекомендуют:
Создать строку с максимально возможной длинной (как - отдельный вопрос)
В VB Script'е не силен,
но вроде можно l_sString=Space(Кол_воМаксимально_возможных_символов)
В цикле запоминать СохраненаяДлина_Len=СохраненаяДлина_Len+ len( Cstr(l_oRs.Fields("field").value) )
и далее
mid( l_sString,СохраненаяДлина_Len,Len(Cstr(l_oRs.Fields("field").value) ))
Т.е. будем врезать в строку с пробелами, значение поля начиная с последнего символа данных. Должно работаь быстро.
Вроде сумбурно объяснил, попробую сделать на VBA. Пример выложу.
...
Рейтинг: 0 / 0
StringBuffer
    #32128219
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самому было интресно поэтому создал тестовую процедурку на VB (прийдется передалать тебе на VB-Script, но это не долго)

Открываю рекодсет и гоняю его 1000 раз( для надежности).
Первый раз с функцией Mid с заранее выделнным буйером
Второй обычной конкатенцией
Результат на Пне3 1050Герц/256 Мб/Win2000 SP2
такой в милисекундах
Mid=1081
Конкатенция=121445
Итого Mid быстрее Конкатенции в 112 раз на этом примере

Тебе только надо правильно подобрать буфер. Можно сделать один раз подсчет, увеличить это значени раз в 100, а можно считать динамически.

Public Sub MID_OR_NOT_MID()
Dim str
Dim k
str = Space(10000000)
Dim i
Dim j
Dim rs As New ADODB.Recordset
rs.Open "tbl2ProductName", CurrentProject.Connection, adOpenDynamic, adLockReadOnly

Dim t As Long 'счетчик времени

i = 0
j = 0
t = timeGetTime
For k = 1 To 1000

Do While Not rs.EOF
j = Len(CStr(rs("NameOfProduct_rus").Value))
Mid(str, i + 1, j) = CStr(rs("NameOfProduct_rus").Value)
i = i + j 'запоминаем длину значения

rs.MoveNext
Loop

rs.MoveFirst
i = 0
j = 0
Next k
Debug.Print "Mid - "; timeGetTime - t

i = 0
j = 0
Dim str2
t = timeGetTime
For k = 1 To 1000
Do While Not rs.EOF
str2 = str2 & CStr(rs("NameOfProduct_rus").Value)
rs.MoveNext
Loop

rs.MoveFirst
i = 0
j = 0
Next k
Debug.Print "&&& - "; timeGetTime - t

rs.Close: Set rs = Nothing
End Sub
...
Рейтинг: 0 / 0
StringBuffer
    #32128225
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringBuffer это жаба, что бы проиллюстрировать использование StringBuffer'a

пример бы помог, как врезать строку с помощью mid...

> mid( l_sString,СохраненаяДлина_Len,Len(Cstr(l_oRs.Fields("field").value) ))

это же возвратит строку в подстроке?
а мне нужна конкатенация строк...

Врезать можно replace, но непонятно каким боком это сделать... :(
...
Рейтинг: 0 / 0
StringBuffer
    #32128237
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин,
Mid(str, i + 1, j) = CStr(rs("NameOfProduct_rus").Value)
делает ИМЕЕНО конкатенцию
Посмотри в работе

Было Пустая строка
Стало "Что-то...далее пусто"
Стало "Что-тоНОвоеЧто-То...далее пусто"
Стало ""Что-тоНОвоеЧто-ТоЕЩЕЧТО_ТО...далее пусто"

Чем не угодил?

З.Ы.
Да забыл сказать
str = Space(10000000) сжирает около 19 мегов памяти, но быстро и не заметно :-)
...
Рейтинг: 0 / 0
StringBuffer
    #32128259
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oops
набил, "спасибо", и забыл отправить.
т.ч. получай мое огромное галактическое спасибо! :-)

думаю еще про такую фигню:
StringBuffer внутри работает по принципу удвоения памяти, т.е.
начинается все с
len(string)
когда места под следующую строку не хватает, он становится
len(string) * 2
ну и так далее.
интересно можно ли такой алгоритм красиво реализовать на васике или не получиться?

в задаче строки получаются от 4K до 2 - 5 мегабайт (в плохую погоду)
заказывать каждый раз по 5 метров на буффер, жааалко...

ЗЫ
я не знал, что можно mid использовать в обратную сторону.
...
Рейтинг: 0 / 0
StringBuffer
    #32128275
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>я не знал, что можно mid использовать в обратную сторону.

Mid может быть как и Mid Function так и Mid Statement

А каков результат?

>интересно можно ли такой алгоритм красиво реализовать на васике или не получиться?

Если честно, ну ничего непонял. У меня это бывает :-) Так что подробнее...
...
Рейтинг: 0 / 0
StringBuffer
    #32128304
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я заметил, что делать 2 дела сразу плохо сказывается на обоих...
А если их три....

Я имел в виду выделение памяти под строку для хранения данных, назовем ее
l_sStorage.
В Java классе StringBuffer, такое выделение работает по принципу удвоения.
т.е.
мы говорим
StringBuffer buffer = new StringBuffer("1234567890");
выделилось 40 байтов: 10 байтов * 2 (потому что уникод) и умножить еще на 2 шоб было.

по мере добавления символов в буффер, на момент когда память кончается,
выделяется еще
{текущий размер буффера} * 2
и так каждый раз.
т.е. когда мы превысили те 40 байтов, что нам дали в начале, внутренний размер увеличился до 80, в след раз до 160, потом до 320.

конечно это упрощенное описание алгоритма без учета того, что следующая строка к-рую пихаешь в буффер может быть больше самого буффера в нескольо раз.

меня интересует элегантное решение для такого алгоритма на васике.
когда строка кончается придется делать так
l_sOldString = l_sString
l_lMaxLen = l_lMaxLen * 2
l_sString = space(l_lMaxLen*2)
mid( l_sString, 1, l_sLen) = l_sOldString

для вот этого (пока недоделанного) класса :)

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class StringBuffer

	' current length
	private l_lLen

	private l_lMaxLen
	' string holder 
	private l_sString 

	public sub Class_Initialize()
		l_lLen =  0  
		l_lMaxLen =  100 
		l_sString = space(l_lMaxLen)
	end sub 
	
	
	public sub Class_Terminate()
	   l_sString = ""
	end sub

	public function append(a_sString) 
	
	
	end function 

	public function toString(a_sString) 
		toString = trim( l_sString ) 
	end function 

	public function length() 
		length = l_lLen
	end function 

end class


пока еще не дописал :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / StringBuffer
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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