PDA

View Full Version : سوال: ساخت 3000 ترد همزمان



Mask
چهارشنبه 04 مرداد 1391, 19:36 عصر
با سلام.
در برنامه ای نیاز دارم که آنن 3000 تا ترد بسازم و عملیاتی رو انجام بدهد.
با حلقه for که میسازم .این 3000 ترد حدود 30 ثانیه طول میکشه.
در صورتی که من در برنامه هایی دیدم که آنن میشه مثلا 5000 تا ترد رو با هم ساخت.
ممنون از دوستان بابت راهنمایی.

Felony
چهارشنبه 04 مرداد 1391, 21:33 عصر
تو حلقه به صورت معمول از کلاس Thread ت 3000 تا نمونه میسازی ؟ کار خاصی این وسط انجام نمیدی ؟ نباید اینقدر طول بکشه .

Mask
پنج شنبه 05 مرداد 1391, 12:35 عصر
من هر کاری کردم نشد و زمان زیادی صرف شد بازم.
نمونه زیر رو ببینید.
من با این روش تردهامو میسازم.

Felony
پنج شنبه 05 مرداد 1391, 14:13 عصر
رو چه سیستمی این برنامه رو اجرا میکنید ؟! برای من 718 میلی ثانیه طول کشید !

Mask
پنج شنبه 05 مرداد 1391, 14:27 عصر
3000 تا رو تو 718 میلی ثانیه؟
سیستمم cori7 و رم 4 گیگ هست. و ویندوز سون 64 بیتی.
اینی که شما میفرمایید . یعنی بلافاصله که رو دکمه کلیک کردید . باید کپشن فرم بشه 3000 .
همینجوری میشه؟
--------------------------------------------------------- update
مشکل سرعت رو فهمیدم .
همین نمونه رو با دلفی 7 و در ویندوز xp که کامپایل کردم. در کمتر از یک ثانیه به 3000 رسیدم. اما وقتی با دلفی xe در ویندوز سون کامپایل کردم حدود 30 ثانیه طول کشید.
علت رو هم نفهمیدم . که فرق این دونوع دلفی و ویندوز چیه . که اینقدر تفاوت زمانی داره.
اگه بخام دقیق تر در مورد این برنامه بگم :
دارم یه برنامه برتی فورس مینویسم. که برنامم عدد تولید میکنه تا برسه به عددی که وجود داره.
من روش استفاده از مالتی تردینگ در نظرم هستش . که سریع به جواب برسم.
چون در برنامه بروتی فورسی دیدم که در یک ثانیه پنج میلیون رشته تولید میکنه.
آیا ممکنه که ما پنج میلیون ترد در یک ثانیه بسازیم؟
آیا این روش خوبیه یا روشی بهتر از مالتی ترد کردن برنامه به تعداد 5000000 داریم.؟
چطوری اون برنامه در یک ثانیه میتونه 5 میلیون رشته تولید کنه؟
ممنون از پاسختون.

Felony
پنج شنبه 05 مرداد 1391, 15:43 عصر
همین نمونه رو با دلفی 7 و در ویندوز xp که کامپایل کردم. در کمتر از یک ثانیه به 3000 رسیدم. اما وقتی با دلفی xe در ویندوز سون کامپایل کردم حدود 30 ثانیه طول کشید.
علت رو هم نفهمیدم . که فرق این دونوع دلفی و ویندوز چیه . که اینقدر تفاوت زمانی داره.
من با XE 2 روی ویندوز 7 نسخه 64 بیتی برنامه رو اجرا کردم .

فایل اجرایی که با دلفی 7 کامپایل کردی و روی XP جواب میده روی 7 درسته یا اون هم مشکل داره ؟!


آیا این روش خوبیه یا روشی بهتر از مالتی ترد کردن برنامه به تعداد 5000000 داریم.؟
چطوری اون برنامه در یک ثانیه میتونه 5 میلیون رشته تولید کنه؟
کی گفته برای تولید 5000,000 رشته باید 5000,000 ترد بسازی ؟!

شما اول ببین یک تردت تو 1 ثانیه چند تا عدد تولید میکنه بعد میتونی یه عدد تقریبی به دست بیاری ببینی چند تا ترد کارت رو راه میاندازه ؛ مثلا تو کد زیر من بررسی کردم که تو 1 ثانیه چند تا عدد رندوم میشه تولید کرد :

var
StartTime, ElapsedTime: Word;
RandomNumber, RandomNumberCount: Integer;
begin
StartTime := GetTickCount;
ElapsedTime:= 0;
RandomNumberCount := 0;
RandSeed := MilliSecondOf(Now);
while (ElapsedTime <= 1000) do
begin
ElapsedTime:= GetTickCount - StartTime;
RandomNumber := Random(1000);
Inc(RandomNumberCount);
end;
ShowMessage(Format('%d random numbers generated in %d miliseconds',
[RandomNumberCount, ElapsedTime]));
end;

سیستم من با استفاده از کد بالا تو 1014 میلی ثانیه حدود 11.5 میلیون عدد رندوم تولید کرد ؛ خوب برای ساخت 5000,000 عدد رندوم فکر نکنم به بیشتر از 10 تا ترد نیاز باشه ( با در نظر گرفتن عملیات های انتصابی عدد ها به آرایه یا ... )

فکر نکن با ساخت 5000,000 ترد برنامت میشه بوگاتی ویرون ! 5,000,000 ترد یعنی مرگ !

@ عمرا بتونی 5000,000 بسازی ، مگه Memory Manager ویندوز چقدر حافظه در Stack به برنامت اختصاص میده ؟ نهایتا با تغییر سایز Stack در پارامترهای تابع CreateThread بتونی چند صد هزار تا ترد بسازی که بازم کار عاقلانه ای نیست .