Быстрая работа со строками

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Быстрая работа со строками

Сообщение |kerish| » 12.05.2005 (Чт) 1:54

Нужен самый максимальный по скорости метод получения определенной строки из текста.
Слышал про библиотеку для быстрой работы с текстом.
Посоветуйте самый реактивный метод.

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Re: Быстрая работа со строками

Сообщение Джеффи » 12.05.2005 (Чт) 1:58

|kerish| писал(а):Нужен самый максимальный по скорости метод получения определенной строки из текста.
Слышал про библиотеку для быстрой работы с текстом.
Посоветуйте самый реактивный метод.


А чем не устраивает Split?

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 12.05.2005 (Чт) 2:02

Или попробуй сочитание InStr с Mid... :roll: :?

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 12.05.2005 (Чт) 2:12

Джеффи Пробовал сочетания Mid и Instr. Жутко :(
Есть следующая функция:

Код: Выделить всё
Public Function ReadLine(Text As String, NumberLine As Long) As String
Dim Str As String, Ln As String
Dim i As Long
Dim CurLine As Long
Dim CurSym As String
CurLine = 1
Str = Text
On Error Resume Next
For i = 1 To Len(Str)
CurSym = Mid(Str, i, 1)
If CurLine = NumberLine Then
  If (Asc(CurSym) <> 10) And (Asc(CurSym) <> 13) Then Ln = Ln & CurSym
End If
If Asc(CurSym) = 13 Then CurLine = CurLine + 1
If CurLine > NumberLine Then GoTo lblexit
Next i
lblexit:
ReadLine = Ln
End Function

Это самый быстрый вариант из того, что я имею.
Но он меня не устраивает, так как он самый быстрый из медленных.
Может поможете его оптимизировать или подскажите идею нового варианта.
Связка Mid и Instr получается в разы медленнее этого варианта.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Быстрая работа со строками

Сообщение tyomitch » 12.05.2005 (Чт) 5:05

Джеффи писал(а):А чем не устраивает Split?

Так чем же?
Изображение

sash
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 17.05.2003 (Сб) 3:37

Сообщение sash » 12.05.2005 (Чт) 9:53

Попробуй так, если я правильно понял
Код: Выделить всё
Public Function ReadLine(Text As String, NumberLine As Long) As String
    Dim sTemp() As String
   
    On Local Error Resume Next
   
    ReadLine = ""
       
    sTemp = Split(Text, vbCrLf)
   
    If (UBound(sTemp()) + 1) < NumberLine Then
        Exit Function
    Else
        ReadLine = sTemp(NumberLine - 1)
    End If
   
End Function

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 12.05.2005 (Чт) 11:04

sash спасибо это лучше.
А ещё быстрее никак нельзя?
Например через какую-нибудь библиотеку из C++?

sash
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 17.05.2003 (Сб) 3:37

Сообщение sash » 12.05.2005 (Чт) 11:12

А чем так долго?? Скормил функции String содержащии 40000 строк, так она мгновено выдал 39 509 строку.Наврядли на Си намного быстрее получиться.

Вот так побыстрее будет работать, особенно если много строк а нужно начальную.

Код: Выделить всё
Public Function ReadLine(Text As String, NumberLine As Long) As String
    Dim sTemp() As String
   
    On Local Error Resume Next
   
    ReadLine = ""
       
    sTemp = Split(Text, vbCrLf, NumberLine + 1) 'Изменение
   
    If (UBound(sTemp()) + 1) < NumberLine Then
        Exit Function
    Else
        ReadLine = sTemp(NumberLine - 1)
    End If
   
End Function

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 12.05.2005 (Чт) 11:15

Огромнейшее спасибо!

sash
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 17.05.2003 (Сб) 3:37

Сообщение sash » 12.05.2005 (Чт) 11:20

Так еще на пару тактов :)

Код: Выделить всё
Public Function ReadLine(Text As String, NumberLine As Long) As String
    Dim sTemp() As String
   
    On Local Error Resume Next
   
    ReadLine = ""
       
    sTemp = Split(Text, vbCrLf, NumberLine + 1)
   
    ReadLine = sTemp(NumberLine - 1)
   
End Function

sash
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 17.05.2003 (Сб) 3:37

Сообщение sash » 12.05.2005 (Чт) 16:06

Окончательный вариант, дальше некуда :D
Код: Выделить всё

Public Function ReadLine(Text As String, NumberLine As Long) As String
   
    On Local Error Resume Next
   
    ReadLine = Split(Text, vbCrLf, NumberLine + 1)(NumberLine - 1)
   
End Function

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

Сообщение GSerg » 12.05.2005 (Чт) 16:29

Ну почему же :)

Код: Выделить всё
Public Function ReadLine(Text As String, ByVal NumberLine As Long) As String
   
    On Local Error Resume Next
   
    ReadLine = Split(Text, vbCrLf, NumberLine + 1)(NumberLine - 1)
   
End Function


Так ещё быстрее ввиду отсутствия необходимости в одном дереференсе :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 13.05.2005 (Пт) 8:21

А в чем отличие On Error и On Local Error в VB6?
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.05.2005 (Пт) 9:46

Загляни сюда - http://www.xbeat.net/vbspeed/index.htm
Сайт посвящен более производительным альтернативам стандартных вбшных функций.
Лучший способ понять что-то самому — объяснить это другому.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 161

    TopList