split() нужен аналог в 10-100 раз быстрее.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

split() нужен аналог в 10-100 раз быстрее.

Сообщение xenomorph » 11.04.2009 (Сб) 10:11

День добрый!

Задача - необходимо разделить текст 2,5 мб на слова в массиве.

Делал так:
Код: Выделить всё
Dim s_Text As String = "a b c... n"
Dim s_a() As String
a = Split(s_Text, " ")


Проблема - долго, очень долго:

split 2,5 мб английского плейн-текста - 47 секунд.

0,0212 мб split-иться в секунду. Это ОЧЕНЬ маленькая скорость... :cry: :cry: :cry:

Можно ли ускорить и если да то как?
--
Заранее спасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: split() нужен аналог в 10-100 раз быстрее.

Сообщение Williams » 11.04.2009 (Сб) 10:19

Хотел посоветовать попробовать regex, но по-скольку имеешь дело всего-лишь с пробелом, может быть стоит заменить массив на коллекцию, загрузить файл целиком в память и нарезать слова читая бинарно?
И вы думаете, что вас оставят в живых после прочтения этого поста?

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re: split() нужен аналог в 10-100 раз быстрее.

Сообщение xenomorph » 11.04.2009 (Сб) 10:32

Спасибо Williams!

Я нашёл в нете:
http://dotnetperls.com/Content/String-Split-Benchmark.aspx

Вот если кому надо:

В заголовок:

Код: Выделить всё
Imports System.Text.RegularExpressions


Код: Выделить всё
Public Sub split_fast(ByVal buf As String, ByRef s_array() As String)
    s_array = Regex.Split(buf, " ")
End Sub


2.5 Мб - 2.1 секунды. Уже намного быстрее!
Если этого не хватит - попробую нарезать из бинарика.

Свасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: split() нужен аналог в 10-100 раз быстрее.

Сообщение Nord777 » 11.04.2009 (Сб) 13:05

xenomorph String.Split работает примерно в 5 раз быстрее Regex.Split(со включенной опцией Compiled)
Просто ты использовал не ту функцию.
Это для твоего случая.
Dim s_Text As String = "a b c... n"
Dim s_a() As String
s_a = s_Text.Split(" "c)

Только запускать надо в Release и не из под студии(можно по Ctrl-F5)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: split() нужен аналог в 10-100 раз быстрее.

Сообщение Williams » 11.04.2009 (Сб) 20:37

Nord777 писал(а):Только запускать надо в Release и не из под студии(можно по Ctrl-F5)


Тоже важно. В релизе оптимизации включены по-умолчанию. Можно включить и в дебаге, но лучше этого делать не стоит.

Простой Split наверное из пространства совместимости VB?
И вы думаете, что вас оставят в живых после прочтения этого поста?

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re: split() нужен аналог в 10-100 раз быстрее.

Сообщение xenomorph » 13.04.2009 (Пн) 10:07

2 Nord777 - огромное спасибо!
Отдельно замер производительности не делал, но буду.

На глаз самое то! Работает почти мнгновенно!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...


Вернуться в Visual Basic .NET

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

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

    TopList