PDA

View Full Version : سوال: مقایسه کدام سریع تر است ؟ int یا char ?



H_G_G_I
یک شنبه 19 آذر 1391, 13:09 عصر
سلام
من یه کلاس استرینگ مخصوص خودم نوشتم :لبخند: به این صورت که می بینید ::

//String With limit Character
class Strlim
{
public:
char m_chars[32];

inline Strlim& operator = (const char* _cstr);
inline bool compare1(const Strlim& _other);
inline bool compare2(const Strlim& _other);
};

Strlim& Strlim::operator=( const char* _cstr )
{
size_t l_len = strlen(_cstr);
if(l_len >= 32)
{
memcpy(m_chars, _cstr, 31);
m_chars[31] = '\0';
}
else
{
memcpy(m_chars, _cstr, l_len);
memset(m_chars + l_len, 0, 32-l_len);
}
return *this;
}

//char comparing
bool Strlim::compare1( const Strlim& _other )
{
for(int i = 0; i < 32; i++)
{
if(m_chars[i] != _other.m_chars[i])
return false;
}
return true;
}
//int comparing
bool Strlim::compare2( const Strlim& _other )
{
int* l_int1 = (int*)m_chars;
int* l_int2 = (int*)_other.m_chars;

for(int i = 0; i < 8; i++)
{
if(*l_int1 != *l_int2)
return false;

l_int1++;
l_int2++;
}
return true;
}

حالا می خوام بدونم کدوم تابع سریع تره compare1 یا compare 2 ؟ :متفکر:
تو حالت دیباگ که میارم اصلا دوتاشون از strcmp هم کند ترن !
تو release همه تو سه سوت کار می کنن اصلا نمی شه فاصله زمانی رو فهمید !:قهقهه:
من در مورد memcpy که می خوندم فهمیدم که اگه مثلا یه ارایه رو 32 بیت 32 بیت کپی کنیم (int) سریع تر از بایت بایت (char)کپی کردنه !
الان من هم می تونم این اریه m_chars رو بایت بایت مقایسه کنم و هم ...
خب حالا کدوم سریع تره !
خودم فکر می کنم compare2 بهتره . :متفکر:

Ananas
یک شنبه 19 آذر 1391, 13:47 عصر
سلام دوست جون.
داخل یک حلقه به تعداد زیاد هر تابع رو فراخونی کن تو این حالت مقایسه ی زمانها بهتر میشه. مثلا تعداد رو اینقدری زیاد کن که یک حلقه حدود یکی دو ثانیه طول بکشه. اونوقت اختلافشون بهتر دیده میشه.

#target
یک شنبه 19 آذر 1391, 14:13 عصر
کامپایلر های هوشمند احتمالا کد برابری از لحاظ سرعت تولید کنند
ولی کد اول 32 بار عمل مقایسه 8 بیتی و 32 بار افزایش انجام میده
کد دوم 8 بار مقایسه 32 بیتی و 16 بار عمل جمع و هشت بار افزایش داره

دستور مقایسه که فکر کنم 8 و 32 یکی باشه .
به نظر کد دوم سریعتر عمل میکنه . ولی خوب تو محیط اشتراکی نمیشه دقیق گفت و به خیلی پارامتر دیگه هم ربط داره

H_G_G_I
یک شنبه 19 آذر 1391, 14:51 عصر
ممنون الان تست کردم !
نگو قبلش کامپایلر تابع تو حلقه رو بر می داشت ! :متفکر: :متفکر:
دومیه سریع تره !
الان اینقدری تستت کردم .

for(int i = 0; i < 16000000; i++)
{
for(int n = 0; n < 6; n++)
{
for(int o = 0; o < 6; o++)
{
// if(l_strs[n].compare1(l_strs[o]))
// l_n++;
//OR
// if(l_strs[n].compare2(l_strs[o]))
// l_n++;

}
}
}

با اولی 6.8 ثانیه شد با دومی 4.6 . :لبخند:
در ضمن با strcmp امتحان کردم به میلی ثانیه هم نرسید !
strcmp اول ادرس رشته ها رو مقایسه می کنه درسته؟

H_G_G_I
یک شنبه 19 آذر 1391, 14:57 عصر
الان با __int64 زدم بهتر تر شد. 3.2 ثانیه :متفکر:
:متفکر:

مصطفی ساتکی
یک شنبه 19 آذر 1391, 16:43 عصر
با sse پیاده کنید سریعتر هم میشه خود کامپایلر از see4 استفاده می کنه و کدش کلاً اسمبلی هستش

H_G_G_I
یک شنبه 19 آذر 1391, 18:07 عصر
با sse پیاده کنید سریعتر هم میشه خود کامپایلر از see4 استفاده می کنه و کدش کلاً اسمبلی هستش

من اسمبلی اشنا نیستم در حد همون mov,add,sub بلدم .:خجالت:
میشه اینو sse کنید !:قلب:
:قلب:
اگه یکی هم توضیح بدین در مورد sse خیلی ممنون میشم !

مصطفی ساتکی
دوشنبه 20 آذر 1391, 08:37 صبح
مثل این sample

; compile with FASM
; Immediate byte constants
EQUAL_ANY = 0000b
RANGES = 0100b
EQUAL_EACH = 1000b
EQUAL_ORDERED = 1100b
NEGATIVE_POLARITY = 010000b
BYTE_MASK = 1000000b

; ==== strcmp ====

strcmp_sse42:
; Using __fastcall convention, ecx = string1, edx = string2
mov eax, ecx
sub eax, edx ; eax = ecx - edx
sub edx, 16

STRCMP_LOOP:
add edx, 16
MovDqU xmm0, dqword[edx]
; find the first *different* bytes, hence negative polarity
PcmpIstrI xmm0, dqword[edx + eax], EQUAL_EACH + NEGATIVE_POLARITY
ja STRCMP_LOOP

jc STRCMP_DIFF

; the strings are equal
xor eax, eax
ret
STRCMP_DIFF:
; subtract the first different bytes
add eax, edx
movzx eax, byte[eax + ecx]
movzx edx, byte[edx + ecx]
sub eax, edx
ret

#target
دوشنبه 20 آذر 1391, 16:21 عصر
توابع و نوع داده ای مخصوصش در سی پلاس پلاس . حداقل ویژوال . تعریف شده و نیازی به اسمبلی نیست
جستجو کنین گیر میاد .
نوع داده ای مثل __m128

H_G_G_I
دوشنبه 20 آذر 1391, 19:29 عصر
توابع و نوع داده ای مخصوصش در سی پلاس پلاس . حداقل ویژوال . تعریف شده و نیازی به اسمبلی نیست
جستجو کنین گیر میاد .
نوع داده ای مثل __m128

اره جستجو کردم !یکمی یاد گرفتم !
الان فقط نمی دونم چطور مقایسه کنم ! _mm_cmpneq_ss ؟_mm_cmpneq_ps ؟:متفکر:
اگه می تونی اینو با __m128 بنویس ! دمت گرم !:بوس::بوس:
من هرچی سرچ کردم مقایسه ارایه نبود ! همش ضرب و جمع بود !
یکمی هم سخته گیج شدم .:گیج:

aidinMC
پنج شنبه 23 آذر 1391, 21:57 عصر
در ضمن با strcmp امتحان کردم به میلی ثانیه هم نرسید !
strcmp اول ادرس رشته ها رو مقایسه می کنه درسته؟

الگوریتم (کد) strcmp بصورت زیره :


int strcmp (const char *p1, const char *p2)
{
register const unsigned char *s1 = (const unsigned char *) p1;
register const unsigned char *s2 = (const unsigned char *) p2;
unsigned reg_char c1, c2;

do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);

return c1 - c2;
}