PDA

View Full Version : سوال: سرعت لود برنامه



mehrdad1991h
سه شنبه 31 اردیبهشت 1392, 17:13 عصر
سلام
دوستان من برنامه ای نوشتم در فرم لود برنامه 2 کد بیشتر قرار ندادم که اون 2 کد هم وقتی فرم لود میشه به وسیله بک گراند ورکر اجرا میشوند و کاری به فرم نداره
حالا مشکل اینجاست که سرعت لود برنامه خیلی پایینه
یعنی وقتی روی ایکن برنامه کلیک میکنم بعد از حدود 10 ثانیه تازه اون 2 کدی که برای بکگراند ورکر بوده اجرا میشه و فرم نمایش داده میشه

الان من از کجا میتونم بفهمم دلیلش چیه ؟
چه کاری میتونم انجام بدم این مشکل حل بشه

وقتی هم که دیگه بیام با اسمارت اسمبلی بخوام یعنی ازش یه مقدار کمی حفاظت بشه دیگه سرعت لود خیلییی میاد پایین در حد 15 ثانیه میشه حدودا !!!

لطفا راهنمایی فرمایید

چند بار چک کردم مشکل از فرم لود نیست کد های موجود در فرم لود را کلا برداشتم سلوشن را پاک کردم برنامه را ری بویلد کردم ولی هیچ تغییری نمیکنه !

چه کنم ؟ حداقل یه جوری بشه یه فرم نمایش داد کاربر بفهمه برنامه داره لود میشه ! من چه کنم ؟
سپاس

mhsmity
سه شنبه 31 اردیبهشت 1392, 19:40 عصر
در حالت کلی سرعت اجرای برنامه پوشه Relase از پوشه Debug بیشتر هستش .
خوب کامپایل شدن برنامه از از حالت Debug به Relase تغییر بدین سرعت اجرای فایل اجرای بیشتر(بهتر) خواهدشد.

فکر کنم (شاید) مشکل از فرم لود نباشه ایا داخل رویداد فرم اکتیو کدی دارین یا نه؟

برای فهمیدن این که کدوم تابع طول می کشه خیلی راحت از Breakpoint کلید F9 استفاده کنن .
خط به خط برنامه رو Breakpoint کنید و با F5 خط به خط جلو برو بین کدام خط یا کدام تابع هستش که طول می کشه.
وقتی درست مشکل رو متوجه شدین یکم بهینه سازی کد داشته باشید.
به همین راحتی.

tooraj_azizi_1035
سه شنبه 31 اردیبهشت 1392, 20:14 عصر
Put your code

مهرداد صفا
سه شنبه 31 اردیبهشت 1392, 21:58 عصر
با سلام.
native image را امتحان کنید:
مقاله: Native Image Generator - Ngen.exe (http://barnamenevis.org/showthread.php?117376-Native-Image-Generator-Ngen.exe)

mehrdad1991h
سه شنبه 31 اردیبهشت 1392, 23:48 عصر
دوستان ممنون بابت نظراتتون ولی مشکل را الان دیدم دقیق لود کردن خودم فرم هست از روش میخواد نمونه سازی کنه نمونه سازیش زمان میبره
در کلاس Program.cs که برنامه با اون اغاز میشه
در این قسمت
Application.Run(new Form1());
برنامه زمان زیادی صرف میکنه !
دیگه این یکی را توی بکگراند ورکر که نمیشه گذاشت ! هر فرم دیگه ای هم نشون بدم هنگ میکنه برنامه تا کل برنامه لود بشه !

با native image هم فک کنم کار خیلی پیچیده تر از حالا بشه باتوجه به محتوای و کدنویسی فرم !!!

الان پیشنهاد چیست ؟ پیشنهادی هست !؟

مهرداد صفا
چهارشنبه 01 خرداد 1392, 01:07 صبح
دوستان ممنون بابت نظراتتون ولی مشکل را الان دیدم دقیق لود کردن خودم فرم هست از روش میخواد نمونه سازی کنه نمونه سازیش زمان میبره
در کلاس Program.cs که برنامه با اون اغاز میشه
در این قسمت
Application.Run(new Form1());
برنامه زمان زیادی صرف میکنه !
دیگه این یکی را توی بکگراند ورکر که نمیشه گذاشت ! هر فرم دیگه ای هم نشون بدم هنگ میکنه برنامه تا کل برنامه لود بشه !

با native image هم فک کنم کار خیلی پیچیده تر از حالا بشه باتوجه به محتوای و کدنویسی فرم !!!

الان پیشنهاد چیست ؟ پیشنهادی هست !؟

با سلام.
کدهای constructer مربوط به form1 و تعریف و مقداردهی متغیر های عمومی که در Form1 تعریف شده اند با این دستور صورت میگیرد.
به نظر من:
1- متغیرهای در سطح کلاس را تعریف کنید و مقداردهی آنها را بعد از نمایش فرم انجام دهید.
2- در متود سازنده کدهای ضروری را نوشته، فرم را نمایش دهید و سپس کدهای غیر ضروری را (در صورت نیاز در یک Thread مجزا یا backgroundWorker) اجرا کنید.
برای مثال اگر چنین کدی دارید:

//in the name of god
//صل الله علی محمد و آله

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
byte[] array = new byte[1000000000];
public Form1()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.Black;
//long action
for (uint i = 0; i < 4000000000; i++)
{
//some action...
}
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}


به این صورت تغییر دهید:

//in the name of god
//صل الله علی محمد و آله

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
byte[] array;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.Black;
this.Text = "pleas wait...";
System.Threading.Thread thread2 = new System.Threading.Thread(() =>
{
array=new byte[1000000000];
//long action
for (uint i = 0; i < 4000000000; i++)
{
//some action...

}
this.Text = "ok";
});
thread2.Start();
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

FastCode
چهارشنبه 01 خرداد 1392, 01:38 صبح
اگر حافظه براتون مهم نیست form رو preload کنید.
جست و جو کنید form preloading