Enterprise: O controle suspenso multisseleção apresenta baixo desempenho no IE11 quando a lista suspensa contém +500 opções

Criado em 25 set. 2018  ·  18Comentários  ·  Fonte: infor-design/enterprise

Descreva o bug
Estamos usando vários controles multi-seleção SOHO para permitir que um usuário filtre opções em um formulário. Os controles multisseleção contêm opções em qualquer lugar na faixa de 50-2000. O tempo que leva para abrir o menu suspenso, desde quando o usuário clica no controle até o momento em que o menu suspenso realmente abre, tem um bom desempenho na maioria dos navegadores modernos. Quanto mais opções houver em um controle multisseleção, mais tempo ele levará para abrir. Isso é compreensível, pois uma vez que o controle é construído, ele tem que percorrer todos os elementos OPTION dentro do elemento SELECT, construir o elemento de controle da lista suspensa e, em seguida, anexá-lo ao documento.

Após o teste no IE11, o desempenho é significativamente pior, quando comparado a outros navegadores modernos. Realizei alguns testes e incluí meus resultados e processo de teste abaixo.

Para testar com precisão o tempo que leva para abrir o menu suspenso, criei 2 variáveis dentro do open método do o Dropdown plugin.

Eu defini uma variável para registrar o desempenho no início do método open :

var performanceCheckStart = performance.now();

Eu defini uma variável para registrar o desempenho no final do método open :

var performanceCheckEnd = performance.now();

No final do método open , uma vez concluído, subtraio a hora de início da hora de término para obter o tempo total (em milissegundos) decorrido.

console.log("Call to open took " + (performanceCheckEnd - performanceCheckStart) + " milliseconds.");

Realizei 10 testes para controles multisseleção com o seguinte número de opções na lista:

  • 100
  • 500
  • 1000
  • 1500
  • 2000

Esses testes foram realizados em 2 navegadores:

  • Chrome v69.0.3497.100 (mais recente) no Mac OS
  • Internet Explorer 11 no Win 7

Calculei a média dos resultados de cada um dos testes de navegador realizados e coloquei-os na tabela abaixo.
_Observe que o tempo de resposta é em milissegundos._

Chrome no Mac OS

| # opções | 100 500 | 1000 1500 | 2000 |
| --- | --- | --- | --- | --- | --- |
| ms | 53 170,26 | 317,93 | 474,15 | 756,73 |

IE 11 no Win 7

| # opções | 100 500 | 1000 1500 | 2000 |
| --- | --- | --- | --- | --- | --- |
| ms | 174,31 | 648,29 | 1257,99 | 1836,29 | 2497,06 |

Com base nesses resultados, fica claro que há uma perda significativa de desempenho entre os navegadores e à medida que mais opções aparecem em uma lista suspensa.

Reproduzir
Passos para reproduzir o comportamento:
Usando os exemplos multisseleção no site do SoHo XI
https://design.infor.com/code/ids-enterprise/4.10.0/demo/multiselect/example-index

  1. Adicione opções adicionais à seleção múltipla (500, 1000, 1500, 2000)
  2. Inicializar o controle
  3. No IE 11 (usando Windows 7 ou Windows 10), clique em um dos controles para abrir a lista suspensa. Observe como é mais lento para abrir.

Comportamento esperado
A lista suspensa aparece quando um usuário clica no controle, mas o desempenho no IE 11 é muito ruim quando uma lista contém mais de 500 opções

Plataforma

  • Dispositivo: Laptop (VM)
  • Versão do sistema operacional: Windows 7 [Service Pack 1] (também confirmou resultados semelhantes no Windows 10)
  • Nome do navegador: Internet Explorer (IE11)
  • Versão do navegador: 11.0.9600.19129

Contexto adicional
Há alguma melhoria de desempenho que pode ser feita para agilizar a abertura desse controle no IE11?

[8] type

Comentários muito úteis

Acho que @EdwardCoyle está correto ao dizer que precisaríamos reformular isso do zero, usando técnicas mais modernas para aumentar a eficiência. Não tenho certeza se vale a pena gastar mais de um dia neste @davidcarlsonberg .

Todos 18 comentários

Os resultados do nosso teste para isso parecem muito melhores do que esses números para mim.
http://master-enterprise.demo.design.infor.com/components/dropdown/test-2000-items.html

Talvez haja um problema específico com a seleção múltipla. Eles têm o mesmo código, mas alguns caminhos diferentes.

No código de teste final, você tinha um? Ou muitos drop downs?

@tmcconechy , para meus testes, tenho 5 controles multisseleção na página. Quando mudo esses controles para um menu suspenso (não multisseleção), noto uma melhoria significativa no desempenho. Este problema parece específico dos controles multisseleção.

Discutindo esse assunto, um pouco curioso sobre o caso de uso real? Que tipo de escolha multisseleção o usuário está fazendo?

@picitelli é a melhor pessoa para conversar.
Pelo que entendi, a lista precisa ser construída sempre que o menu suspenso for ativado e pode haver até cerca de 2.000 itens, dependendo da função do usuário. Eles precisam recarregar o menu suspenso em alguns pontos, mas não podem se comunicar com o plug-in do Mongoose.
Não tenho certeza de que tipo de opções de seleção múltipla estão sendo feitas.
Eu li muito sobre o IE11 ter um desempenho ruim ao adicionar itens ao DOM em geral e incluir alguns links abaixo.
https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4561410/
https://stackoverflow.com/questions/43003579/internet-explorer-11-very-slow-appending-elements-to-dom
https://stackoverflow.com/questions/24913564/appending-large-groups-of-elements-in-ie11-enormously-slow

Definitivamente, o IE é lento no DOM, mas eu queria saber o caso de uso real em que o usuário vê 500 coisas e precisa escolher quais. Parece que no máximo 50 opções seria mais apropriado para uma IU de decisão / seleção.

Provavelmente podemos torná-lo mais rápido, mas imaginando se o caso de uso seria melhor atendido por um componente diferente.

Com certeza seria melhor atendido por um componente diferente, mas o cliente pede é para usar o dropdown. Se quisermos voltar e dizer, este não é o componente certo e você terá problemas no IE11 ... talvez atualizar para o Edge? Suponho que poderíamos oferecer a sugestão.

@tmcconechy , para nosso aplicativo, temos 4 controles suspensos de seleção múltipla que um usuário pode acessar para filtrar os resultados em uma página de listagem de pedidos. A quantidade de opções que aparecem nesses menus suspensos é baseada na seleção do usuário e também nas permissões (função) que um usuário recebe. Um usuário regular estará limitado a ver apenas uma pequena gama de opções. Depois que eles fazem as seleções, temos uma chamada de API que preenche mais opções em um controle suspenso secundário usado para filtragem adicional. (Esses menus suspensos se comunicam entre si.)

Um usuário com permissões totais de administrador verá todas as opções no controle suspenso. No momento, o total de opções é de 1969. Esse número pode crescer de acordo com o que o cliente deseja utilizar.

Um usuário pode ver apenas 2-50 opções dentro do controle, mas se receberem permissões adicionais, a quantidade de opções que eles têm pode se expandir até 1969. Não queremos oferecer outro controle (por exemplo, pesquisa de produto) que adiciona um etapa adicional para que eles interajam e executem seu processo de filtragem quando o controle de seleção múltipla for a melhor opção, especialmente quando a maioria dos usuários verá um número menor de opções.

É frustrante lidar com o IE11 e sei que o desempenho não é ideal quando há tantas opções sob controle. Esse mesmo controle, usado sem a configuração "múltiplo" e como apenas uma lista suspensa de seleção, não tem as mesmas preocupações de desempenho no IE11 quando há cerca de 2.000 opções. Somente como multisseleção existe esse grande problema de desempenho.

Eu também gostaria que fosse tão simples quanto dizer a eles para atualizarem seus navegadores, mas este aplicativo é para os clientes clientes, que estão predominantemente no IE11.

@tmcconechy @EdwardCoyle
Tenho trabalhado com diversas soluções para otimizar este código para o IE e não encontrei nenhuma solução que, uma vez implementada, aumente o desempenho do IE11. Minha recomendação neste ponto é recuar e sugerir um componente diferente se eles quiserem um melhor desempenho. A partir de agora, o menu suspenso e a multisseleção funcionam muito bem com até 500 itens. 2000, conforme solicitado nesta edição, parece-me excessivo para tal componente.
Fico feliz em receber qualquer conselho ou discussão além deste tópico de comentários.

@picitelli se pedimos que suportemos o IE11 nessas condições, a solução não é simples. Nosso componente suspenso precisaria de uma revisão muito séria, pois nunca foi projetado com esse tipo de carga em mente.

@davidcarlsonberg @clepore @nickwynja @tmcconechy devemos conversar sobre este. Eu tenho algumas idéias sobre como lidar com o desempenho, mas essas idéias caem no território de "refatoração".

Eu pensei que havia uma grande diferença entre o dropdown com 2000 e multiselect com 2000. Você explorou a diferença na velocidade para um ganho mais imediato.

Eu estava olhando mais para a causa raiz da queda no desempenho. Posso investigar dropdown multiselect vs plain dropdown se quisermos alterar o escopo deste tíquete para ver o que pode ser ganho lá para uma vitória rápida.

Sim, definitivamente vale a pena dar uma olhada, eu estava baseando essa suposição neste comentário https://github.com/infor-design/enterprise/issues/843#issuecomment -424495956

Qualquer coisa pode ajudar, mesmo que seja um pouco "um pouco" mais rápido

Prosseguirei para determinar e melhorar a diferença entre o menu suspenso e a multisseleção.

Acho que @EdwardCoyle está correto ao dizer que precisaríamos reformular isso do zero, usando técnicas mais modernas para aumentar a eficiência. Não tenho certeza se vale a pena gastar mais de um dia neste @davidcarlsonberg .

@picitelli Continuaremos procurando opções para lidar com esse caso de ponta de desempenho.

Acho que a melhor opção para este caso é usar um indicador de ocupado :

Um indicador de ocupado notifica o usuário de que o sistema está processando uma solicitação e que ele deve aguardar o processamento dessa solicitação antes de continuar com a tarefa atual.

Aqui está um exemplo de como usá-lo em um campo:

A melhor experiência seria aguardar um segundo ou mais e exibir apenas o indicador de ocupado se a lista ainda não tiver aparecido.

Após exame no Chrome recente no macOS, a diferença no dropdown vs multiselect response() tempo de execução. Observe as unidades.
lista suspensa: 512,14 ms
multisseleção: 1,02 s

@tmcconechy @davidcarlsonberg @EdwardCoyle @clepore Agradeço a todos que estão analisando este problema. Especialmente @davidcarlsonberg , obrigado por dedicar seu tempo a isso. Há quase 2 semanas tentamos otimizar para o IE11 e não encontramos nada além de becos sem saída. Concordo com a avaliação de que esse controle não foi feito para lidar com essas muitas opções e outro controle seria mais adequado.

@nickwynja , apresentará sua recomendação de indicador de atividade com design e verá o que eles dizem.

Obrigado novamente a todos!

Encerrando este problema, pois não há nenhum teste de controle de qualidade envolvido. Por favor, veja os comentários para mais informações.

Esta página foi útil?
0 / 5 - 0 avaliações