Re[4]: Функция обработки строки
От: rus blood Россия  
Дата: 24.05.04 17:28
Оценка:
К>Ну и получается, что сперва сбегали от начала до конца, а затем ещё раз — от позиции до следующего пробела.
К>Лишняя работа.

Понятно, что лишняя. И хорошо бы, если бы длина была известна заранее (string).

Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.
Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 17:47
Оценка: -1
Здравствуйте, rus blood, Вы писали:

RB>Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.

RB>Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".

Ах, мечты, мечты... Посимвольно.
Перекуём баги на фичи!
Re[6]: Функция обработки строки
От: Шахтер Интернет  
Дата: 24.05.04 18:24
Оценка: 41 (3) +1
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, rus blood, Вы писали:


RB>>Но насколько мне казалось, функции strlen и strchr работают гораздо быстрее банальных переборов по одному символу.

RB>>Насколько я понимаю, эти функции проверяют сразу четверки символов — оптимизатор не сможет сделать то же самое из обычного цикла "по символу".

К>Ах, мечты, мечты... Посимвольно.


Ни хрена подобного. Главный цикл выделен жирным.

        page    ,132
        title   strlen - return the length of a null-terminated string
;***
;strlen.asm - contains strlen() routine
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       strlen returns the length of a null-terminated string,
;       not including the null byte itself.
;
;*******************************************************************************

        .xlist
        include cruntime.inc
        .list

page
;***
;strlen - return the length of a null-terminated string
;
;Purpose:
;       Finds the length in bytes of the given string, not including
;       the final null character.
;
;       Algorithm:
;       int strlen (const char * str)
;       {
;           int length = 0;
;
;           while( *str++ )
;                   ++length;
;
;           return( length );
;       }
;
;Entry:
;       const char * str - string whose length is to be computed
;
;Exit:
;       EAX = length of the string "str", exclusive of the final null byte
;
;Uses:
;       EAX, ECX, EDX
;
;Exceptions:
;
;*******************************************************************************

        CODESEG

        public  strlen

strlen  proc

        .FPO    ( 0, 1, 0, 0, 0, 0 )

string  equ     [esp + 4]

        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop

str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned

        add     eax,dword ptr 0         ; 5 byte nop to align label below

        align   16                      ; should be redundant

main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop
        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0
        test    ah,ah                   ; is it byte 1
        je      short byte_1
        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2
        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set

byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret

strlen  endp

        end
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Функция обработки строки
От: sva1509  
Дата: 24.05.04 18:37
Оценка:
Здравствуйте, rus blood, Вы писали:

К>>Если бы не требование — позиция как аргумент функции — то достаточно было бы функций

К>>strchr(str,' ')
К>>или
К>>strcspn(str," ")

RB>Чем плохо strchr(str + pos, ' ')?

RB>Понятно, что pos надо сравнить с длиной строки сначала...

Браво rus blood а то я уж думал тут вообще C незнают.
Когда читал тему чуть с кресла не свалился.
конечноже:
char *st1;

st1=strchr(str+pos,' ');

Работа в C без указателей не мыслима !
Re[7]: Функция обработки строки
От: Кодт Россия  
Дата: 24.05.04 21:47
Оценка: :)
Здравствуйте, Шахтер, Вы писали:

Ш>Ни хрена подобного. Главный цикл выделен жирным.


Поллитру мне, поллитру! Буду курить эту формулу...
do
{
  a1 = *s
  d1 = 0x7EFEFEFF;
  d2 = d1 + a1;
  a2 = ~a1;
  a3 = a2 ^ d2; // = ~a1 ^ (a1 + 7EFEFEFF)
}
while((a3 & 81010100) == 0);

если я всё правильно переписал...
Осталось разобраться.
... << RSDN@Home 1.1.2 stable >>
Перекуём баги на фичи!
Re[4]: Функция обработки строки
От: Кодт Россия  
Дата: 25.05.04 06:42
Оценка:
Здравствуйте, sva1509, Вы писали:

S>Браво rus blood а то я уж думал тут вообще C незнают.

S>Когда читал тему чуть с кресла не свалился.
S>конечноже:
S>char *st1;

S>st1=strchr(str+pos,' ');

Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?
Перекуём баги на фичи!
Re[8]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 07:22
Оценка:
К>Поллитру мне, поллитру! Буду курить эту формулу...
К>
К>do
К>{
К>  a1 = *s
К>  d1 = 0x7EFEFEFF;
К>  d2 = d1 + a1;
К>  a2 = ~a1;
К>  a3 = a2 ^ d2; // = ~a1 ^ (a1 + 7EFEFEFF)
К>}
К>while((a3 & 81010100) == 0);
К>

К>если я всё правильно переписал...
К>Осталось разобраться.

Сие есть некое магическое шаманство (если ты конечно правильно перевел с asm), который "определяет" наличие нулевого байта в четверке... После нахождения такой четверки код функции просто линейно перебирает в нем байты по одному.

Я так понимаю, 64-разрядная версия будет работать еще быстрее.
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 07:24
Оценка:
S>>st1=strchr(str+pos,' ');
К>[/c]
К>Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?


Сдается мне, что споры о проверке параметра pos не имеют смысла. Я так сильно подозреваю, что исходная задача состоит в том, чтобы перебрать все пробелы в некоем тексте, начиная, ессно, с начала. Посему, параметр pos, скорее всего, на самом деле вообще не нужен.
Имею скафандр — готов путешествовать!
Re[4]: Функция обработки строки
От: Lorenzo_LAMAS  
Дата: 25.05.04 09:39
Оценка:
J>а ты полюбопытствуй в Стандарте

А я и так подозреваю, что это беззнаковый тип.
Of course, the code must be complete enough to compile and link.
Re[5]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.04 09:51
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

J>>а ты полюбопытствуй в Стандарте :)


L_L>А я и так подозреваю, что это беззнаковый тип.


тогда полюбопытствуй еще там же, что такое npos :)

чтобы не тратить твое время:
namespace std {
  template<class charT, class traits = char_traits<charT>,
  class Allocator = allocator<charT> >
  class basic_string {
  public:
     typedef typename Allocator::size_type size_type;
     static const size_type npos = -1;
  .....
  };


Так что возвращать -1 — вполне легально.

P.S. ZmaximI же не указал, какого типа ему нужен результат :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.04 09:56
Оценка:
Здравствуйте, rus blood, Вы писали:


S>>>st1=strchr(str+pos,' ');

К>>[/c]
К>>Ты бы не только тему, но и всю дискуссию прочёл. Не "конечноже". Где контроль длины строки в твоём коде?


RB>Сдается мне, что споры о проверке параметра pos не имеют смысла. Я так сильно подозреваю, что исходная задача состоит в том, чтобы перебрать все пробелы в некоем тексте, начиная, ессно, с начала. Посему, параметр pos, скорее всего, на самом деле вообще не нужен.


и как же ты собираешься перебирать следующие после первого найденного пробелы?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Функция обработки строки
От: rus blood Россия  
Дата: 25.05.04 10:03
Оценка:
J>и как же ты собираешься перебирать следующие после первого найденного пробелы?

Используя номер позиции уже найденного.
Имею скафандр — готов путешествовать!
Re[5]: Функция обработки строки
От: jazzer Россия Skype: enerjazzer
Дата: 26.05.04 08:12
Оценка: +1
Здравствуйте, Vamp, Вы писали:

V>Ничем.

V>Запутаннее. :))

думаю, он еще и медленнее
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.