Реально ли ускорить Instr?

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

Реально ли ускорить Instr?

Сообщение |kerish| » 05.10.2005 (Ср) 0:50

У меня в разработке некой утилиты возникла проблема с быстродействием алгоритма использующего InStr и функцию преобразования Hex в строку.

Реально ли ускорить Instr?

или ускорить функцию перевода Hex в строку?

Код: Выделить всё
Private Function HexToStr(ByVal Data As String) As String
Dim i As Long
If Len(Data) Mod 2 Then
HexToStr = vbNullString
Else
HexToStr = Space(Len(Data) \ 2)
For i = 1 To Len(Data) Step 2
Mid(HexToStr, i \ 2 + 1, 1) = Chr("&H" & Mid(Data, i, 2))
Next i
End If
End Function

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

Сообщение GSerg » 05.10.2005 (Ср) 0:53

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

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

Сообщение |kerish| » 05.10.2005 (Ср) 0:55

Да, кстати, повторюсь.
То ли на этом форуме, то ли где-то ещё какой-то человек выкладывал или давал ссылку на библиотеку для офигенно быстрой работой со строками.

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

Сообщение |kerish| » 05.10.2005 (Ср) 0:56

GSerg А где у меня Variant? Если ты в общем имеешь ввиду, то у меня Variant-ов нету и везде прописан Option Explicit.

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

Сообщение GSerg » 05.10.2005 (Ср) 0:59

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

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.10.2005 (Ср) 2:33

Mid$, Left$, Space$...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Antonariy » 05.10.2005 (Ср) 8:51

http://www.xbeat.net/vbspeed/index.htm
Однако instr им побить не удалось...
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 05.10.2005 (Ср) 9:13

InStr им и не побить.
Он компилируется непосредственно в машинный код; при использовании бинарного сравнения непосредственно в инструкцию процессора.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 05.10.2005 (Ср) 9:14

GSerg писал(а):Для начала, прекрати использовать Variant...

И кроме того, не стоит использовать конкатенцию строк.
Chr("&H" & Mid(Data, i, 2)) следует заменить на работу непосредственно с кодами символов (Asc(...)*16+Asc(...)).
Последний раз редактировалось alibek 05.10.2005 (Ср) 9:20, всего редактировалось 1 раз.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 05.10.2005 (Ср) 9:19

P.S. Не наезд, а просто размышления на тему.
|kerish|, ты меня поражаешь. Выпускаешь системные утилиты, которые по твоим заверениям превосходят всех LavaSoft, Касперских и Симантеков, вместе взятых, и вместе с тем используешь такие дилетантские решения.
Mid(HexToStr, i \ 2 + 1, 1) = Chr("&H" & Mid(Data, i, 2)) ведь потом появилось, вначале у тебя было HexToStr = HexToStr & Chr("&H" & Mid(Data, i, 2)).
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Antonariy » 05.10.2005 (Ср) 9:23

InStr им и не побить.
Он компилируется непосредственно в машинный код; при использовании бинарного сравнения непосредственно в инструкцию процессора.

А instrrev побили. И их вариант работает быстрее instr.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 05.10.2005 (Ср) 9:24

InStrRev да, поскольку он вызывается из MSVBVM. Я говорил только о InStr.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 05.10.2005 (Ср) 9:26

Antonariy писал(а):А instrrev побили. И их вариант работает быстрее instr.

А где ты нашел InStrRev? Я что-то найти не смог.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Antonariy » 05.10.2005 (Ср) 9:30

В секции vb6->vb5
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение |kerish| » 05.10.2005 (Ср) 9:53

alibek Kerish Antivirus - не превосходит Касперского по эффективности, а лишь по скорости, Kerish Doctor - реально превосходит конкурентов лишь из-за того, что знает на порядок больше проблем.

to All Короче скорость усилить так и не удалось. Файл в 20 кб сверяется с базой в 32219 сигнатур за 2 секунды. А файл в 40 кб - 5 секунд, файл в 100 кб 13 секунд. Поэтому скорость критически низкая :(

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

Сообщение alibek » 05.10.2005 (Ср) 10:00

Я бы советовал грузить файлы в байтовые массивы (порциями по 500-1000Кб), и искать внутри них, только не InStr (она не работает с массивами), а через WinAPI.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение |kerish| » 05.10.2005 (Ср) 10:09

Интересная мысль.
А ты думаешь это ускорит алгоритм? Ведь загрузка файлов в массивы + поиск в них могут дать ту же скорость.

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

Сообщение alibek » 05.10.2005 (Ср) 10:12

Я думаю, что основные потери скорости у тебя возникают из за преобразования Binary <> String. Если ты избавишься от этого преобразования, то думаю, скорость повысится.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Antonariy » 05.10.2005 (Ср) 13:32

Я бы советовал грузить файлы в байтовые массивы (порциями по 500-1000Кб), и искать внутри них, только не InStr (она не работает с массивами), а через WinAPI.

InStr как раз таки преобразует строку в массив в режиме vbBinaryCompare (по умолчанию) и проверяет его, поэтому ее побить и не удалось.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 05.10.2005 (Ср) 14:33

Antonariy, я говорил не об этих преобразованиях (хотя и тут есть лишняя пара Bin-Str-Bin), а о Hex-дампе, который прописан в файлах-сигнатурах и который преобразуется из Hex-дампа в двоичный дамп.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.10.2005 (Ср) 15:52

alibek писал(а):InStr им и не побить.


Откуда такая уверенность? У тебя есть исходники InStr? :) Я не знаю, каким алгоритмом она ведет поиск, но подозреваю, что оптимального алгоритма поиска для всех случаев не существует, и что возможно написать функцию, которая в некоторых случаях будет работать быстрее.
Быть... или не быть. Вот. В чём вопрос?

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

Сообщение alibek » 05.10.2005 (Ср) 15:57

uhm писал(а):Откуда такая уверенность? У тебя есть исходники InStr? :)

Читал в какой-то умной книжке :)
Прямым текстом было рекомендовано использовать ее, когда это применимо, т.к. она имеет прямой аналог в ассемблере (при бинарном сравнении) и именно в него и компилируется.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 05.10.2005 (Ср) 16:05

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

Что может быть быстрее однотактовой команды? :)
Если, разумеется, меня умная книжка не обманула.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.10.2005 (Ср) 16:11

Есть однотактовая команда, которая в последовательности байтов ищет заданную подпоследовательность? Или я просто не понял, о чем разговор идет?
Быть... или не быть. Вот. В чём вопрос?

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

Сообщение tyomitch » 05.10.2005 (Ср) 16:29

uhm писал(а):Есть однотактовая команда, которая в последовательности байтов ищет заданную подпоследовательность? Или я просто не понял, о чем разговор идет?

SCASW - по моему (жутко старому) мануалу, 6 тактов на итерацию.
Может, уже и до одного дооптимизировали.
Изображение

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.10.2005 (Ср) 16:58

Почитал в Яндексе про SCAS(B,W) - вроде бы, они умеют искать в строке только один байт или одно слово, а не подстроку в строке. Если это так, и именно это имел в виду alibek, то все, что я говорил, остается в силе.
Быть... или не быть. Вот. В чём вопрос?

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

Сообщение tyomitch » 05.10.2005 (Ср) 17:20

Думаю, что это именно так, хотя исходников компилятора VB, конечно, не видел :-)

Что касается "оптимальных алгоритмов поиска подстроки в строке" - то это очень животрепещущая тема, по которой афаик даже сейчас защищаются диссертации. Некоторые алгоритмы есть на http://algolist.manual.ru/search/esearch/index.php , но "самого оптимального", конечно, нет.

2kerish: есть подозрение, что ускорить HexToStr будет гораздо легче, чем мучаться с поиском подстроки. Например, перевести Data сразу в байтовый массив, и работать с ним.
Изображение

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

Сообщение GSerg » 05.10.2005 (Ср) 23:20

Да работает instr с массивами... с байтовыми... И instrb с ними работает...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 05.10.2005 (Ср) 23:23

GSerg, или я не понял твоей мысли, или ты не понял что у kerish нету байтового массива, а есть строка в хексе.
:-?
Изображение

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

Сообщение GSerg » 05.10.2005 (Ср) 23:37

Угу...
Просто 90%, что он таким образом читает файл в память...

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

След.

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

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

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

    TopList