strlen - в одну строку
От: Аноним  
Дата: 20.12.02 19:44
Оценка:
Только не надо сильно гнать на меня, что мол это все знают и т.д
я навечёк еще

//StrLen - возвращает длинну строки;
int strlen(char *str)
{ for (int i=0;*(s+i);i++); return(i);}


и еще сравнение двух строк тоже прикольно :
//StrSravn - сравнение 2 строк (если равны то возвращает 0)
int strsravn(char *s1,char *s2)
{ for (int i=0;*(s1+i) && *(s2+i) && *(s1+i)==*(s2+i);i++);
if (*(s1+i)) return(*(s1+i)-*(s2+i));else return 0;}
Re: strlen - в одну строку
От: ZakkeR Россия http://znav.narod.ru
Дата: 24.12.02 00:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>//StrLen - возвращает длинну строки;
А>int strlen(char *str)
А>{ for (int i=0;*(s+i);i++); return(i);}
А>


Вот такой вариант работает малость быстрее (на пару тактов )

__inline int    strz_len(const char *s)
{
    register int l = -1; do {l++;} while (*(s+l)); return l;
}


Кстати, у тебя ошибка с параметром
regards
Re[2]: strlen - в одну строку
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.12.02 07:02
Оценка:
const char *p = s;
for(; *p; p++);
return p-s;
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: strlen - в одну строку
От: Whisperer  
Дата: 24.12.02 07:11
Оценка:
Здравствуйте, Andrew S, Вы писали:

Вот и я думаю если так всегда за производительностью гонятся — но проверки все таки включать надо, хотя бы на NULL.
Re[4]: strlen - в одну строку
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.12.02 07:14
Оценка:
А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.

W>Вот и я думаю если так всегда за производительностью гонятся — но проверки все таки включать надо, хотя бы на NULL.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: strlen - в одну строку
От: Whisperer  
Дата: 24.12.02 07:25
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.


Вот поэтому — сейчас и такие "тормознутые" системы
Re[5]: strlen - в одну строку
От: Atilla Россия  
Дата: 24.12.02 07:43
Оценка: 5 (1)
Здравствуйте, Andrew S, Вы писали:

AS>А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.


W>>Вот и я думаю если так всегда за производительностью гонятся — но проверки все таки включать надо, хотя бы на NULL.


тогда надо assert'ом проверять. Он выполняется только в debug-версии.
... << RSDN@Home 1.0 beta 3 >>
Кр-ть — с.т.
Re[2]: strlen - в одну строку
От: MaximE Великобритания  
Дата: 24.12.02 07:49
Оценка:
Здравствуйте, ZakkeR, Вы писали:

ZR>Вот такой вариант работает малость быстрее (на пару тактов )


ZR>
ZR>__inline int    strz_len(const char *s)
ZR>{
ZR>    register int l = -1; do {l++;} while (*(s+l)); return l;
ZR>}
ZR>


ZR>Кстати, у тебя ошибка с параметром


Так как microsoft'овские компиляторы игнорируют register, то быстрее где?
Re[6]: strlen - в одну строку
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.12.02 08:36
Оценка:
Поддерживаю.

A>тогда надо assert'ом проверять. Он выполняется только в debug-версии.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: strlen - в одну строку
От: ZakkeR Россия http://znav.narod.ru
Дата: 25.12.02 03:38
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, ZakkeR, Вы писали:


ZR>>Вот такой вариант работает малость быстрее (на пару тактов )


ZR>>
ZR>>__inline int    strz_len(const char *s)
ZR>>{
ZR>>    register int l = -1; do {l++;} while (*(s+l)); return l;
ZR>>}
ZR>>


ZR>>Кстати, у тебя ошибка с параметром


ME>Так как microsoft'овские компиляторы игнорируют register, то быстрее где?


А регистер тут вообще не причем. Это я его поставил чтоб было

На самом деле мой код быстрее, потому как содержит только один условный переход. Скомпили со всеми оптимизациями оба кода и сравни.
regards
Re[4]: strlen - в одну строку
От: MaximE Великобритания  
Дата: 25.12.02 09:04
Оценка:
Здравствуйте, ZakkeR, Вы писали:

ZR>А регистер тут вообще не причем. Это я его поставил чтоб было


ZR>На самом деле мой код быстрее, потому как содержит только один условный переход. Скомпили со всеми оптимизациями оба кода и сравни.


Скомпилировал твой вариант и свой со всеми оптимизациями по скорости в VC++ 7. Твой проиграл целый байт :


__inline int strlen1(const char *s)
{
    register int l = -1; do {l++;} while (*(s+l)); return l;
}

__inline size_t strlen2(const char* s)
{
    size_t n = 0;
    while (*s++) ++n;
    return n;
}


int _tmain(int argc, _TCHAR* argv[])
{
    const char* s = "Test";
    size_t s1 = strlen1(s);
    size_t s2 = strlen2(s);

    bool b = s1 == s2; // это чтоб s1 и s2 не соптимизировались в ничто :)))

    std::cout << b << "\n";

    return 0;
}



int _tmain(int argc, _TCHAR* argv[])
{
    const char* s = "Test";
    size_t s1 = strlen1(s);
00401000 83 C9 FF          or          ecx,0FFFFFFFFh 
00401003 8A 81 A1 47 42 00 mov         al,byte ptr [ecx+4247A1h] 
00401009 41                inc         ecx  
0040100A 84 C0             test        al,al 
0040100C 75 F5             jne         main+3 (401003h) 
    size_t s2 = strlen2(s);
0040100E 33 C0             xor         eax,eax 
00401010 8A 90 A1 47 42 00 mov         dl,byte ptr [eax+4247A1h] 
00401016 40                inc         eax  
00401017 84 D2             test        dl,dl 
00401019 75 F5             jne         main+10h (401010h) 

    bool b = s1 == s2;
0040101B 3B C8            cmp         ecx,eax 
0040101D 0F 94 C0         sete        al
Re[5]: strlen - в одну строку
От: ZakkeR Россия http://znav.narod.ru
Дата: 27.12.02 04:44
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, ZakkeR, Вы писали:


ZR>>А регистер тут вообще не причем. Это я его поставил чтоб было


ZR>>На самом деле мой код быстрее, потому как содержит только один условный переход. Скомпили со всеми оптимизациями оба кода и сравни.


ME>Скомпилировал твой вариант и свой со всеми оптимизациями по скорости в VC++ 7. Твой проиграл целый байт :


А если сравнить результат?

твоя функция выдает 1 на пустую строку
regards
Re[6]: strlen - в одну строку
От: MaximE Великобритания  
Дата: 27.12.02 06:49
Оценка:
Здравствуйте, ZakkeR, Вы писали:

ZR>твоя функция выдает 1 на пустую строку


Наговариваешь — грех это
Re[7]: strlen - в одну строку
От: ZakkeR Россия http://znav.narod.ru
Дата: 27.12.02 07:29
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, ZakkeR, Вы писали:


ZR>>твоя функция выдает 1 на пустую строку


ME>Наговариваешь — грех это


К сожелению VC7 не имею, а VC6 оптимизирует несколько по другому.
Давай глядеть в код:

00401000 83 C9 FF or ecx,0FFFFFFFFh
00401003 8A 81 A1 47 42 00 mov al,byte ptr [ecx+4247A1h]
00401009 41 inc ecx
0040100A 84 C0 test al,al
0040100C 75 F5 jne main+3 (401003h)
size_t s2 = strlen2(s);
0040100E 33 C0 xor eax,eax
00401010 8A 90 A1 47 42 00 mov dl,byte ptr [eax+4247A1h]
00401016 40 inc eax
00401017 84 D2 test dl,dl
00401019 75 F5 jne main+10h (401010h)

видно что твоя и моя функция отличаются только начальным значением смещения. У меня -1, у тебя 0
Кстати, что есть адрес 4247A1h ? По моему это адрес 2-го байта строки. Т.е. Твоя функция в данном конкретном случае была жутко соптимизирована (снимаю шляпу перед VC7). Поскольку VC7 знает, что в данном случае ему подсовывают КОНСТАНТНУЮ строку, и эта строка не пустая, то данный код работает верно. Но! Если подставить пустую строку, копилятор VC7 подозреваю, вообще цикл выкинет.
Попробуй сделать строку не константной, да так чтобы компилятор в это поверил и смотри что получится.

А в VC6 твоя функция компилируется значительно хуже моей.
regards
Re[8]: strlen - в одну строку
От: MaximE Великобритания  
Дата: 27.12.02 08:52
Оценка:
Здравствуйте, ZakkeR, Вы писали:

[]

ZR>Попробуй сделать строку не константной, да так чтобы компилятор в это поверил и смотри что получится.


ZR>А в VC6 твоя функция компилируется значительно хуже моей.


Да, вот так получается похуже:

--- d:\c++\strlen\strlen.cpp ---------------------------------------------------
// strlen.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

__inline size_t strlen1(const char *s)
{
    register size_t l = -1; do {l++;} while (*(s+l)); return l;
}

__inline size_t strlen2(const char* s)
{
    size_t n = 0;
    while (*s++) ++n;
    return n;
}

int _tmain(int argc, _TCHAR* argv[])
{
    const size_t s1 = strlen1(argv[1]);
00401000  mov         eax,dword ptr [esp+8] 
00401004  mov         ecx,dword ptr [eax+4] 
00401007  or          edx,0FFFFFFFFh 
0040100A  lea         ebx,[ebx] 
00401010  mov         al,byte ptr [ecx+edx+1] 
00401014  inc         edx  
00401015  test        al,al 
00401017  jne         main+10h (401010h) 
00401019  push        ebx  
    const size_t s2 = strlen2(argv[1]);
0040101A  mov         bl,byte ptr [ecx] 
0040101C  xor         eax,eax 
0040101E  test        bl,bl 
00401020  je          main+2Bh (40102Bh) 
00401022  mov         bl,byte ptr [ecx+eax+1] 
00401026  inc         eax  
00401027  test        bl,bl 
00401029  jne         main+22h (401022h) 

    std::cout << s1 << "\t" << s2 << "\n";
0040102B  push        offset string "\n" (4247A0h) 
00401030  push        eax  
00401031  push        offset string "\t" (42479Ch) 
00401036  push        edx  
00401037  push        offset std::cout (429B14h) 
0040103C  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401060h) 
00401041  push        eax  
00401042  call        std::operator<< (402510h) 
00401047  add         esp,8 
0040104A  push        eax  
0040104B  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401060h) 
00401050  push        eax  
00401051  call        std::operator<< (402510h) 
00401056  add         esp,8 

    return 0;
00401059  xor         eax,eax 
0040105B  pop         ebx  
}
0040105C  ret              
--- No source file -------------------------------------------------------------
Re: strlen - в одну строку
От: orangy Россия
Дата: 27.12.02 10:18
Оценка: 29 (4)
Здравствуйте, <Аноним>, Вы писали:

А>
А>//StrLen - возвращает длинну строки;
А>int strlen(char *str)
А>{ for (int i=0;*(s+i);i++); return(i);}
А>


этот код не соответствует стандарту С++. Переменная i уже "не существует" в момент return. То что у тебя на VC компиляется — вольность MS.
... << RSDN@Home 1.0 beta 4 | Сейчас пятница, 16:12, слушаю тишину >>
"Develop with pleasure!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.