none
Melhorar Performance de função RRS feed

  • Pergunta

  • Pessoal, Boa tarde

    Eu tenho uma função recursiva que percorre uma lista de classe que representam as abstrações dos itens de menu do sistema e cria os controles para serem apresentados na tela, o problema é que ela está muito lenta. Eu gostaria de sugestões para melhorar a performance, no Generate chamando no Factory eu crio sempre uma nova instância do controle.

    Essa é a função:


     void CriarMenu(int IdPai, Component CtlPai, int Nivel,List<MenuAcessos> Acessos)
            {
                int NivelAtual = Nivel;


                bool AppMenu = (CtlPai is ApplicationMenu);

                System.Windows.Forms.Control ctlFilho;
                Component Container;
                foreach (MenuAcessos item in Acessos)
                {

                    ctlFilho = ControlMenuFactory.GetInstance(Nivel, AppMenu, item.TipoItem, item, out Container, IdSistemas,IdUsuario,frmPrinc);

                    if (Container != null)
                        CriarMenu(item.IdMenuProgramas, Container, ++Nivel,item.FILHOS);
                    Nivel = NivelAtual;
                    if (CtlPai is PopupMenu)
                    {
                        ((PopupMenu)CtlPai).Items.Add(ctlFilho);
                    }
                    else if (CtlPai is Ribbon && ctlFilho is RibbonTabPage)
                    {
                        ((Ribbon)CtlPai).TabPages.Add((RibbonTabPage)ctlFilho);
                    }
                    else if (CtlPai is System.Windows.Forms.Control)
                    {
                        ((System.Windows.Forms.Control)CtlPai).Controls.Add(ctlFilho);
                    }
                    if (ctlFilho is Util.Button && item.TELAINICIAL == 'S') {
                        ((Util.Button)ctlFilho).PerformClick();
                    }
                }
            }

    Essa é a função que chama dentro dela que retorna a abstração do tipo de componente de acordo com as características do tipo de item de menu.

    public static System.Windows.Forms.Control GetInstance(int Nivel, bool AppMenu, Util.Enums.TipoMenu TpMenu, MenuAcessos Ma, out Component Container,int IdSistema,int IdUsuario,Form frmPrinc)
            {
                IControlMenu ctlMenu=null;

                if ((IsPasta(TpMenu)||Ma.FILHOS.Count>0) && AppMenu)
                {
                    ctlMenu= new DropDownN();
                }
                else if ((IsPasta(TpMenu)||Ma.FILHOS.Count>0) && Nivel == 0)
                {
                    ctlMenu = new TabPageN();
                }
                else if ((IsPasta(TpMenu) || Ma.FILHOS.Count > 0) && Nivel > 0)
                {
                    ctlMenu = new DropDownN();
                }
                else {
                    ctlMenu = new ButtonN(Ma, IdSistema, IdUsuario, frmPrinc);
                }

                return ctlMenu.Generate(Ma.NOMEITEM, Ma.FuncaoItem, Ma.Icone, out Container);
            }

          
    quinta-feira, 28 de fevereiro de 2013 18:32

Todas as Respostas

  • algumas sugestões amigo:

    1 - altere o foreach para o for..

    2 - a cada menu processado, remove-lo da lista..

    3 - passar seus parametros por referencia ( ref ) ao invés de por valor para evitar a duplicação deles na memória, e para demorar um processo assim, sua lista esteja grande, e ele perca tempo copiando a cada interação recursiva.

    4 - tente verificar se possui uma interface em comum entre suas classes para evitar o uso excessivo do casting...

    Abraços !

    Afonso Fernandes.

    quinta-feira, 28 de fevereiro de 2013 19:07
  • Obrigado.

    Vou testar.

    quinta-feira, 28 de fevereiro de 2013 19:57