PDA

View Full Version : سوال: کلاس string سرعت را کاهش می دهد؟!!



Nabege
یک شنبه 03 فروردین 1393, 17:11 عصر
آیا واقعا استفاده از کلاس string سرعت برنامه را به شدت کاهش می دهد ؟؟؟
من امروز یه برنامه نوشتم که حالت های متفاوت در مورد یک چیز رو بررسی می کنه و تو اون از کلاس string استفاده می کنم.
اجراش که کردم دیدم سرعتش خیلی پایینه و فقط 5000 حالت رو تو ثانیه بررسی می کنه.
در صورتی که وقتی این برنامه رو قبلا بدون استفاده از کلاس string (با نوع char) نوشتم سرعت خیلی بالا بود در حد 50000000 حالت در ثانیه.
یعنی واقعا کلاس string سرعت رو به شدت کاهش میده ؟؟؟؟
دلیلش به نظرتون چیه که سرعت این کلاس اصلا بهینه نیست ؟؟

rahnema1
یک شنبه 03 فروردین 1393, 19:48 عصر
تو چه موردی بوده؟

omid_kma
یک شنبه 03 فروردین 1393, 20:07 عصر
اتفاقا کلاس های استاندارد ++C از اون چیزی که فکرشو هم بکنین بهینه تر هستن
اگر String ده هزار برابر کند تر بود که تا حالا چند بار bjarne stroustrup خودکشی کرده بود:قهقهه:
شاید از سازنده های کلاس ( copy constructor ,... ) یا + += و ... زیاد استفاده می کنین
کدتونو بزارید !

Nabege
یک شنبه 03 فروردین 1393, 20:14 عصر
ببخشید کدم رو نمی تونم بزارم (به دلایلی)
ولی من از اعمالی که گفتین زیاد استفاده می کنم و همچنین از آرایه هایه بزرگ string هم زیاد استفاده می کنم. مثل زیر:
string saht[1001][500]={}; d

omid_kma
یک شنبه 03 فروردین 1393, 20:28 عصر
ببخشید کدم رو نمی تونم بزارم (به دلایلی)
ولی من از اعمالی که گفتین زیاد استفاده می کنم و همچنین از آرایه هایه بزرگ string هم زیاد استفاده می کنم. مثل زیر:
string saht[1001][500]={}; d
*char با string زیاد فرقی نداره خود کلاس string هم از char* برای ذخیره داده ها استفاده می کنه که با ()c_str میشه بهش دسترسی داشت
مشکل از جای دیگست .
آخرین چیزی که میتونین بهش شک کنین بهینه نبودن string ه !

darknes666
یک شنبه 03 فروردین 1393, 20:35 عصر
احتمال نمیدی از سخت افزار باشه؟
منظورم دما و مشغول بودن cpu یا وجود ویروس و کرم.

Nabege
یک شنبه 03 فروردین 1393, 23:46 عصر
کلامم واضحه تو کد قدیمی از char (نهchar* ) استفاده کردم ولی تو کد جدیده فقط از string استفاده کردم.
تو چندتا سایت خارجی هم که رفتم نوشته بود که سرعت char چند برابر string هست.
فکر کنم دلیلش هم این باشه که string از char* استفاده می کنه و شاید هم دلیلش تابع هاش هم باشه.
در کل فکر کنم چون من از آرایه های خیلی بزرگ استفاده می کنم این سرعت ِچند برابر،خودش رو بروز میده و چند هزار برابر می شه .
فکر کنم اینجوری باشه عاقلانه نیست ؟؟؟ چون اصلا فکر نکنم دلیلش کدم باشه چون دقیقا کد قبلیَست و فقط هرجا char بود و تابع های char بود از string و تابع های خاص خودش که راحتترن استفاده کردم ، نه چیزی اضافه کردم نه کم.


احتمال نمیدی از سخت افزار باشه؟
منظورم دما و مشغول بودن cpu یا وجود ویروس و کرم.

اگر از سخت افزار یا ویروس باشه سرعت کد قبلیمم باید زیاد کم بشه ولی این اتفاق نمی افته و اختلاف سرعت خیلی زیاده.

rahnema1
یک شنبه 03 فروردین 1393, 23:57 عصر
حتما که لازم نیست کد کامل را بذارید حداقل یک برنامه شبیه اون بذارید تا ببینیم چه طور شده

omid_kma
دوشنبه 04 فروردین 1393, 00:29 صبح
تو چندتا سایت خارجی هم که رفتم نوشته بود که سرعت char چند برابر string هست
لینک سایت هایی که میگید رو بدید ؟!!


در کل فکر کنم چون من از آرایه های خیلی بزرگ استفاده می کنم این سرعت ِچند برابر،خودش رو بروز میده و چند هزار برابر می شه .
حرف شما وقتی درسته که theta 0 دو تا الگوریتم یکی نباشه
وقتی که عملیات هایی که روی String انجام میشه معادلشون روی آرایه هم انجام میشه و فقط توی ثابت زمانی فرق کنن پس توی بدترین حالت پیاده سازی هم نباید توی تعداد بالا ۱۰۰۰۰ برابر تفاوت داشته باشن !!

از push_back زیاد استفاده نکردین توی کدتون ؟

Nabege
دوشنبه 04 فروردین 1393, 13:57 عصر
theta 0 چیه ؟
push_back چیه ؟
تو گوگل انگلیسی سرچ بزنی سایت های زیادی واست میاد.

Nabege
دوشنبه 04 فروردین 1393, 16:17 عصر
یه سری به این لینکا بزنید :
http://www.drdobbs.com/cpp/c-string-performance/184405453
http://stackoverflow.com/questions/3989111/char-vs-string-speed-in-c
http://bytes.com/topic/c/answers/726010-string-performance اینو تا ته بخونید
http://blogs.msdn.com/b/cisg/archive/2008/09/09/performance-analysis-reveals-char-array-is-better-than-stringbuilder.aspx
http://www.gamedev.net/topic/154661-char-array-vs-string/ اینم بد نیست

omid_kma
دوشنبه 04 فروردین 1393, 19:04 عصر
اون لینک اولی که دادید اولا قدیمیه دوما معلوم نیست چی رو با چی تست کرده ! و این که آخه کی میاد ۱۰۰۰۰ بار یک string بسازه پاک کنه خب مشخصه که این سبک کد نویسی اشتباهه

در مورد لینک دوم
برای مقایسه ۲ تا ساختار باید شرایط مساوی باشه آخه این که2 تا قسمت کدش کامل با هم فرق دارن
بعد این که من نگاه کردم همون old code هم memory leak داشت :قهقهه:
این هم متن جواب همین سوالی که گذاشتید :
Edit 2

The two (so called C and C++‎‎‎) codes are different. The "C code" expects ids and names of length lesser than 5, or the program exists with an error. The "C++‎‎‎ code" has no such limitation. Still, this limitation is ground for massive optimization, if you confirm names and ids are always less then 5 characters.





در مورد لینک ۳ من فقط سوال رو خوندم کد اینه

// #1: C++‎‎‎
std::vector<std::stringv;
int main()
{
clock_t t1 = clock();
for (int i = 0; i < 10000000; ++i)
v.push_back("poo");
clock_t t2 = clock();
cout << double(t2 - t1) / CLOCKS_PER_SEC;
}
کافیه قبل از For این رو مینوشت تا سرعت کدش درست میشد

v.reserve(10000000);


قبلا هم گفتم شما وقتی که از string یا vector از push_back زیاد استفاده کنین بدون reserve کردن سرعت کم میشه دقیقا مثل این میمونه که یک آرایه رو همش realloc کنین .

لینک چهارم هم که کد #C هستش:لبخند:

omid_kma
دوشنبه 04 فروردین 1393, 19:13 عصر
theta 0 چیه ؟
push_back چیه ؟


http://www.cplusplus.com/reference/string/string/push_back/
در مورد Θ هم این کتاب فصل اول
http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262033844

Nabege
سه شنبه 05 فروردین 1393, 09:18 صبح
در کل خیلی ممنون از راهنمایی هاتون من برنامم با آرایه char مشخص شده بیشتر سازگاری داره و بنظر میاد که هر کاری می کنم سرعتشم درست نمیشه ، از push_back هم استفاده نمی کنم ولی theta 0 نمی دونم چیه باید بخونم ببینم چیه بعدش نظر بدم .
ولی چند جا دیده بودم که سرعت char از int کمتره این دیگه قضیش چیه چون من تو کدم همش از char یا int8__ برای سرعت بیشتر استفاده میکنم. مگه int8__ همون char نیست ؟؟؟

omid_kma
سه شنبه 05 فروردین 1393, 10:06 صبح
بله همونه
سرعتشون به خاطر این فرق می کنه که ساختار cpu ها 32 بیتی هستش و عملیات ها رو روی مقادیر 32 بیتی سریع تر انجام میدن (البته کاملا بستگی داره به cpu , کامپایلر و سیستم عامل )

Nabege
سه شنبه 05 فروردین 1393, 11:37 صبح
حالا من واسه سرعت بیشتر از int8__ استفاده کنم یا int ؟

omid_kma
سه شنبه 05 فروردین 1393, 12:12 عصر
اگر فکر می کنی که چند نانو ثانیه ارزش 4 برابر شدن مصرف حافظه رو داره از int استفاده کن

Nabege
چهارشنبه 06 فروردین 1393, 10:17 صبح
من برنامم رو با int می نویسم اگه اختلاف سرعت قابل توجه نبود به حالت قبل بر مگردونمش .