Diskuze: Rychlost C#

C# .NET .NET (C# a Visual Basic) Rychlost C# American English version English version

Avatar
Motlja
Člen
Avatar
Motlja:

Zdravím přátelé mám problém s rychlostí programu po kliknutí se provádí

void tb_Click(object sender, EventArgs e)
        {
            Ciselnik c = new Ciselnik((sender as Policko).x, (sender as Policko).y, (sender as Policko).c);
            c.Show();
        }
public partial class Ciselnik : Form
    {
        int x = 0;
        int y = 0;
        int[,] s;
        public Ciselnik(int xi, int yi, int[,] c)
        {
            InitializeComponent();
            x = xi;
            y = yi;
            s = c;
        }

        private void Ciselnik_Load(object sender, EventArgs e)
        {
            Cislo c = new Cislo(Form1.pole);

a ve třídě cislo

class Cislo
    {
        int[,] poleHraci = new int[9, 9];
        bool[] poleObsazenych = new bool[10];


        public Cislo(Policko[,] pole)
        {
            for(int i = 0; i < 9; i++)
            {
                for(int j = 0; j < 9; j++)
                {
                    try
                    {
                        poleHraci[i, j] = Convert.ToInt32(pole[i, j].Text);
                    }
                    catch
                    {
                        poleHraci[i, j] = 0;
                    }

                }
            }
        }

        public bool[] VratVolne(int x, int y, int[,] c)
        {
            ObsazeneRadekSloupec(y,x);


            //ObsazeneOblast(x, y);
            int[,] r = c;
            for (int i = r[0, 0]; i <= r[0, 1]; i++)
            {
                for (int j = r[1, 0]; j <= r[1, 1]; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (k == poleHraci[i, j])
                        {
                            poleObsazenych[k] = true;
                        }
                    }
                }
            }
            //

            bool[] poleVolnych = new bool[10];
            for (int i = 0; i < 10; i++)
            {
                if(poleObsazenych[i])
                {
                    poleVolnych[i] = false;
                }
                else
                {
                    poleVolnych[i] = true;
                }
            }
                return poleVolnych;
        }
        void ObsazeneRadekSloupec(int y, int x)
        {
            for(int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    //radek
                    if (j == poleHraci[i, y])
                    {
                        poleObsazenych[j] = true;
                    }
                    //sloupec
                    if (j == poleHraci[x, i])
                    {
                        poleObsazenych[j] = true;
                    }
                }
            }
        }


        void ObsazeneOblast(int x, int y, int[,] c)
        {
            int[,] r = c;
            for (int i = r[0,0]; i <= r[0,1]; i++)
            {
                for (int j = r[1, 0]; j <= r[1, 1]; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (k == poleHraci[i, j])
                        {
                            poleObsazenych[k] = true;
                        }
                    }
                }
            }
        }

    }
}

Lámu si s tím hlavu ale bez výsledků. Máte nějaké tipy?

Editováno 29.7.2014 23:08
Odpovědět 29.7.2014 23:08
Umím a učím se to co chci, to co mě baví a zajímá!!
Avatar
sadlomaslox25:

a co ze ten program ma delat? mne to prijde nejaky zmateny kod. a hlavne podle toho cos napsal tak to muze byt asi tak 2x kratsi.

 
Nahoru Odpovědět  +1 30.7.2014 3:07
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Co to znamená problém? Je to pomalý? No tak to změř. Dej si tam časový značky a podle nich poznáš co je pomalý.

 
Nahoru Odpovědět 30.7.2014 12:07
Avatar
Motlja
Člen
Avatar
Motlja:

Program jako celkový má řešit sudoku. Tato část prohledává okolní pole řádek a sloupec. cicobasket díky za tip netušil jsem že něco takového tam je.

Nahoru Odpovědět 30.7.2014 22:43
Umím a učím se to co chci, to co mě baví a zajímá!!
Avatar
Odpovídá na Motlja
sadlomaslox25:

neda se nahodou vetsina toho tveho kodu zredukovat nejak takhle ? :D

public class Cislo
{
    int[,] poleHraci = new int[9, 9];

    bool[] VratVolne(int x, int y)
    {
        var obsazene = new bool[10];

        int baseX = (x/3)*3;
        int baseY = (y/3)*3;

        for (int i = 0; i < 9; i++)
        {
            //radky
            obsazene[poleHraci[x, i]] = true;
            //sloupce
            obsazene[poleHraci[i, y]] = true;
            //bunka
            obsazene[poleHraci[baseX + i % 3, baseY + i / 3]] = true;
        }

        return obsazene.Select(o => !o).ToArray();
    }

    void MereniFunkce()
    {
        Stopwatch sw = new Stopwatch();
        sw.Restart();
        VratVolne(3, 4);
        sw.Stop();
        Console.WriteLine("Volani funkce VratVolne trva "+sw.Elapsed.TotalMilliseconds+" ms.");
    }
}

jinak na mereni casu krome system.diagnos­tic.stopwatch pokud mas visual studio v ultimate edici tak je k dispozici i profiler ale je mozne ze to uz bude trosku prisnejsi pro zacatecniky xD

 
Nahoru Odpovědět 30.7.2014 23:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.