|
StringBuffer
|
|||
---|---|---|---|
#18+
хотелось бы какой нибудь буффер для строк: т.к при раскрутке рекордсета и формировании xml используется много конкатенаций, к-рые хотелось бы ускорить ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 13:06 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Если правильно понял вопрос, то: Const Buffer As Long = 256 Dim str As String * Buffer Debug.Print str Тока оперировать потом надо с помщью Mid$, а не конкатенции (+,&) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 13:24 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
хотелось бы что то вроде жабного 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, а этого хотелось бы избежать... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 13:42 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Ну тебе в форум по VB и ASP .Net надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 13:53 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
виктор, я не использую .NET это обычный ASP или же VB ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 14:01 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Я неиспользую и обычного 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. Пример выложу. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 14:41 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Самому было интресно поэтому создал тестовую процедурку на 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:04 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
StringBuffer это жаба, что бы проиллюстрировать использование StringBuffer'a пример бы помог, как врезать строку с помощью mid... > mid( l_sString,СохраненаяДлина_Len,Len(Cstr(l_oRs.Fields("field").value) )) это же возвратит строку в подстроке? а мне нужна конкатенация строк... Врезать можно replace, но непонятно каким боком это сделать... :( ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:10 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Блин, Mid(str, i + 1, j) = CStr(rs("NameOfProduct_rus").Value) делает ИМЕЕНО конкатенцию Посмотри в работе Было Пустая строка Стало "Что-то...далее пусто" Стало "Что-тоНОвоеЧто-То...далее пусто" Стало ""Что-тоНОвоеЧто-ТоЕЩЕЧТО_ТО...далее пусто" Чем не угодил? З.Ы. Да забыл сказать str = Space(10000000) сжирает около 19 мегов памяти, но быстро и не заметно :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:16 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
oops набил, "спасибо", и забыл отправить. т.ч. получай мое огромное галактическое спасибо! :-) думаю еще про такую фигню: StringBuffer внутри работает по принципу удвоения памяти, т.е. начинается все с len(string) когда места под следующую строку не хватает, он становится len(string) * 2 ну и так далее. интересно можно ли такой алгоритм красиво реализовать на васике или не получиться? в задаче строки получаются от 4K до 2 - 5 мегабайт (в плохую погоду) заказывать каждый раз по 5 метров на буффер, жааалко... ЗЫ я не знал, что можно mid использовать в обратную сторону. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:29 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
>я не знал, что можно mid использовать в обратную сторону. Mid может быть как и Mid Function так и Mid Statement А каков результат? >интересно можно ли такой алгоритм красиво реализовать на васике или не получиться? Если честно, ну ничего непонял. У меня это бывает :-) Так что подробнее... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:37 |
|
StringBuffer
|
|||
---|---|---|---|
#18+
Я заметил, что делать 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.
пока еще не дописал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2003, 15:56 |
|
|
start [/forum/topic.php?fid=60&msg=32128123&tid=2171357]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 149ms |
0 / 0 |