purebasic.info

PureBasic forum
Текущее время: Пн июл 16, 2018 9:33 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Процедура поиска текста
СообщениеДобавлено: Вс сен 21, 2014 10:42 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
Процедура поиска текста в юникоде :)
Код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
DisableDebugger
Global r.s="987643456776ttre34ukhgfee2226iio087754rrrw22567oppp00997655333312456881234567890123456789089990975322wr.tuioo0864468o1234567890"
Procedure poisktexta(*s,*s1)
!mov eax,1
!mov dword esi,[p.p_s]
!mov dword edi,[p.p_s1]
!mov word bx,[edi]
!hj6:
!CMP word [esi],0h;проверка на конец строки
!je exitt4
!CMP word [esi],bx
!je prosmottr4
!vozvratt4:
!add esi,2
!add eax,1
!jmp hj6
!exitt4:
!xor eax,eax
ProcedureReturn
!prosmottr4:
!
;!CMP word [esi+8],35h;5 символ 5?
;!jne vtoroi;символ не равeн смотрим с следующего
!
!push esi
!push edi
!zikt4:
!add esi,2
!add edi,2
!CMP word [edi],0h;это конец искомой строки,значит найдена
!je naidenta4
!CMP word [esi],0h;проверка на конец строки=искомая не найдена
!je exitt45
!mov word bx,[edi]
!CMP word [esi],bx
!je zikt4;символ равeн смотрим следующий
!POP edi
!POP esi
!vtoroi:
!mov bx,[edi];загружаем начальный символ искомой строки
!jmp vozvratt4;не равен возвращаемся и смотрим с следующего символа
!exitt45:
!POP edi
!POP esi
!jmp exitt4
!naidenta4:
!POP edi
!POP esi
ProcedureReturn
EndProcedure
time = GetTickCount_()
   For q=0 To 10000000
   poisktexta(@r,@"12345678901234567890")  
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
   ;
   time = GetTickCount_()
   For q=0 To 10000000
   FindString(r,"12345678901234567890",20)
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 3:36 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
А кто нибудь может прокомментировать данный феномен выполнения этого кода?

Изображение

Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
kosjachok писал(а):
А кто нибудь может прокомментировать данный феномен выполнения этого кода?
Кодировка текста исходника - UTF-8.
Для ASCII, кодирока должна быть аналогичная (Простой текст).

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:13 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пн май 05, 2014 5:50 pm
Сообщений: 84
Откуда: Украина, Запорожье
Благодарил (а): 29 раз.
Поблагодарили: 5 раз.
Пункты репутации: 9
Проще говоря, когда занимаетесь копипастом из различных источников, при создании нового документа в редакторе, в формате файла укажите: Кодировка: простой текст))


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:28 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Пётр писал(а):
kosjachok писал(а):
А кто нибудь может прокомментировать данный феномен выполнения этого кода?
Кодировка текста исходника - UTF-8.
Для ASCII, кодирока должна быть аналогичная (Простой текст).


Meoww писал(а):
Проще говоря, когда занимаетесь копипастом из различных источников, при создании нового документа в редакторе, в формате файла укажите: Кодировка: простой текст))


:mrgreen:
Вопрос вообще то был не о кодировке, а о результатах. На первом скрине результаты выполнения - в 2 раза быстрее, отличия в настройках - в одной галке. Почему так?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:31 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
kosjachok писал(а):
На первом скрине результаты выполнения - в 2 раза быстрее, отличия в настройках - в одной галке. Почему так?
Потому что.
Код:
1
2
3
String.s = "1234"
Debug StringByteLength(String, #PB_Ascii)
Debug StringByteLength(String, #PB_Unicode)

Количество байт разное, а чем их больше, тем больше времени затрачивается.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Пётр писал(а):
kosjachok писал(а):
На первом скрине результаты выполнения - в 2 раза быстрее, отличия в настройках - в одной галке. Почему так?
Потому что.
Код:
1
2
3
String.s = "1234"
Debug StringByteLength(String, #PB_Ascii)
Debug StringByteLength(String, #PB_Unicode)

Количество байт разное, а чем их больше, тем больше времени затрачивается.

т.е. НЕ Unicode программы с строками априори работают в 2 раза быстрее, чем та же программа скомпилированная в Unicode ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 4:58 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Пётр писал(а):
kosjachok писал(а):
На первом скрине результаты выполнения - в 2 раза быстрее, отличия в настройках - в одной галке. Почему так?
Потому что.
Код:
1
2
3
String.s = "1234"
Debug StringByteLength(String, #PB_Ascii)
Debug StringByteLength(String, #PB_Unicode)

Количество байт разное, а чем их больше, тем больше времени затрачивается.

Ок, пробуем так:
сохраняем исходник как простой текст, вставляем код , выключаем в настройках компилятора поддержку юникода и что мы видим:

Изображение

видим что там где выше на скрине вопросительные значки всеравно в 2 раза быстрее.
Че так? Юникод то выключен?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Вт сен 30, 2014 5:27 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
kosjachok писал(а):
и что мы видим
У меня не юникодная прога выполняется в два раза быстрее.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура поиска текста
СообщениеДобавлено: Сб окт 04, 2014 7:23 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
Накидал новую процедуру.
смысл поиска по маске(маска это 3 символ которого несуществует в искомой строке)его пишем на место где нам неважен какой будет символ и в этой позиции искомой строке нерассматриваем и проверяем строку дальше!
Код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
DisableDebugger
Global r.s="987643456776ttre34ukhgfee2226iio087754rrrw22567oppp00997655333312456881234567890123456789089990975322wr.tuioo0864468o1234567890"
Procedure poisktexta(*s,*s1,*s2)
!mov eax,1
!mov dword esi,[p.p_s2]
!mov word dx,[esi]
!mov dword esi,[p.p_s]
!mov dword edi,[p.p_s1]
!mov word bx,[edi]
!hj6:
!CMP word [esi],0h;проверка на конец строки
!je exitt4
!CMP word [esi],bx
!je prosmottr4
!vozvratt4:
!add esi,2
!add eax,1
!jmp hj6
!exitt4:
!xor eax,eax
ProcedureReturn
!prosmottr4:
!
;!CMP word [esi+8],35h;5 символ 5?
;!jne vtoroi;символ не равeн смотрим с следующего
!
!push esi
!push edi
!zikt4:
!add esi,2
!add edi,2
!CMP word [edi],0h;это конец искомой строки,значит найдена
!je naidenta4
!CMP word [esi],0h;проверка на конец строки=искомая не найдена
!je exitt45
!mov word bx,[edi]
;
!CMP word dx,bx
!je zikt4
;
!CMP word [esi],bx
!je zikt4;символ равeн смотрим следующий
!POP edi
!POP esi
!vtoroi:
!mov bx,[edi];загружаем начальный символ искомой строки
!jmp vozvratt4;не равен возвращаемся и смотрим с следующего символа
!exitt45:
!POP edi
!POP esi
!jmp exitt4
!naidenta4:
!POP edi
!POP esi
ProcedureReturn
EndProcedure
Debug poisktexta(@r,@"12345678?01234567890",@"?")
   time = GetTickCount_()
   For q=0 To 10000000
   poisktexta(@r,@"12345678901?34567890",@"?")  
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
 


или так в принцепе если существует значит мы его рассматриваем как искомый только если первый любой, ищем свторго и отнимаем позицию-1 :D
Код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
;DisableDebugger
Global r.s="987643456776ttre34ukhgfee2226iio087754rrrw22567oppp00997655333312456881234567890123456789089990975322wr.tuioo0864468o1234567890"
Procedure poisktexta(*s,*s1)
!mov eax,1
!mov dword esi,[p.p_s]
!mov dword edi,[p.p_s1]
!mov word bx,[edi]
!hj6:
!CMP word [esi],0h;проверка на конец строки
!je exitt4
!CMP word [esi],bx
!je prosmottr4
!vozvratt4:
!add esi,2
!add eax,1
!jmp hj6
!exitt4:
!xor eax,eax
ProcedureReturn
!prosmottr4:
!
;!CMP word [esi+8],35h;5 символ 5?
;!jne vtoroi;символ не равeн смотрим с следующего
!
!push esi
!push edi
!zikt4:
!add esi,2
!add edi,2
!CMP word [edi],0h;это конец искомой строки,значит найдена
!je naidenta4
!CMP word [esi],0h;проверка на конец строки=искомая не найдена
!je exitt45
!mov word bx,[edi]
;
;
!CMP word [esi],bx
!je zikt4;символ равeн смотрим следующий
!CMP word bx,003fh
!je zikt4
!POP edi
!POP esi
!vtoroi:
!mov bx,[edi];загружаем начальный символ искомой строки
!jmp vozvratt4;не равен возвращаемся и смотрим с следующего символа
!exitt45:
!POP edi
!POP esi
!jmp exitt4
!naidenta4:
!POP edi
!POP esi
ProcedureReturn
EndProcedure
Debug poisktexta(@r,@"123?567890?234567890")
   time = GetTickCount_()
   For q=0 To 10000000
   poisktexta(@r,@"12345678901234567890")  
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
 


для поиска по байту ASCII
Код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
;DisableDebugger
Procedure poisktexta(*s,*s1)
!mov eax,1
!mov dword esi,[p.p_s]
!mov dword edi,[p.p_s1]
!mov byte bl,[edi]
!hj6:
!CMP byte [esi],0h;проверка на конец строки
!je exitt4
!CMP byte [esi],bl
!je prosmottr4
!vozvratt4:
!add esi,1
!add eax,1
!jmp hj6
!exitt4:
!xor eax,eax
ProcedureReturn
!prosmottr4:
!push esi
!push edi
!zikt4:
!add esi,1
!add edi,1
!CMP byte [edi],0h;это конец искомой строки,значит найдена
!je naidenta4
!CMP byte [esi],0h;проверка на конец строки=искомая не найдена
!je exitt45
!mov byte bl,[edi]
!CMP byte [esi],bl
!je zikt4;символ равeн смотрим следующий
!CMP byte bl,3fh
!je zikt4
!POP edi
!POP esi
!vtoroi:
!mov byte bl,[edi];загружаем начальный символ искомой строки
!jmp vozvratt4;не равен возвращаемся и смотрим с следующего символа
!exitt45:
!POP edi
!POP esi
!jmp exitt4
!naidenta4:
!POP edi
!POP esi
ProcedureReturn
EndProcedure
Debug poisktexta(?ggg,@"is?el")
Debug poisktexta(?ggg,@"ishel")
Debug poisktexta(?ggg,@"i?h?l")
   time = GetTickCount_()
   For q=0 To 10000000
   poisktexta(?ggg,@"ishel")  
   Next
   t.d = (GetTickCount_() - time)/1000
   MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
    DataSection
  ggg:
  Data.a 112,114,114,105,115,104,101,108
EndDataSection
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB