Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Efficienza ciclo C#

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    12

    Efficienza ciclo C#

    Salve a tutti,
    Sto scrivendo un programma in C# per popolare i campi di una pagina web in modo automatico.
    In particolare, in questa pagina è presente un drop-down contenente circa 5300 campi.
    Il codice che sto usando è il seguente:
    codice:
    private void button2_Click(object sender, EventArgs e)
            {
                foreach (InternetExplorer ie in new ShellWindows())
                {
                    if (ie.LocationURL.Contains("aams"))
                    {
                        for (int i = 1; i < ie.Document.GetElementsByTagName("option").length - 1; i++)
                        {
                            if (ie.Document.GetElementsByTagName("option")[i].InnerText.Contains("testo da cercare"))
                            {
                                ie.Document.GetElementsByTagName("option")[i].SetAttribute("selected", "true");
                                ie.Document.GetElementsByTagName("input")["aggiungi"].Click();
                                break;
                            }
                        }
                        ie.Document.GetElementById("num").SetAttribute("value", "1");
                        ie.Document.GetElementsByTagName("input")["prepara"].Click();
                        ie.Document.GetElementById("nome_sftw1").SetAttribute("value", "Nome_Software");
                        ie.Document.GetElementById("cod_sha11").SetAttribute("value", "1234567890");
                        ie.Document.GetElementsByTagName("input")["Acquisisci"].Click();
                    }
                }
            }
    Il problema di questo codice sta nel ciclo for, che è estremamente lento: solo per arrivare a valutare 1000 campi, ci mette una 30ina di secondi (o anche più).
    Conoscete un algoritmo più efficiente del ciclo for per fare questo?
    Vi ringrazio.

  2. #2
    Se ti devi scorrere tutti gli elementi non è che tu possa fare molto diversamente...
    In prima battuta comunque già potresti evitarti una marea di lookup di GetElementsByTagName("option") & co. salvandoti il riferimento fuori dal ciclo:
    codice:
            private void button2_Click(object sender, EventArgs e)
            {
                foreach (InternetExplorer ie in new ShellWindows())
                {
                    if (ie.LocationURL.Contains("aams"))
                    {
                        var output = ie.Document.GetElementsByTagName("option");
                        var aggiungi = ie.Document.GetElementsByTagName("input")["aggiungi"];
                        for (int i = 1; i < output.length - 1; i++)
                        {
                            if (output[i].InnerText.Contains("testo da cercare"))
                            {
                                output[i].SetAttribute("selected", "true");
                                aggiungi.Click();
                                break;
                            }
                        }
                        // eccetera
    Ma sospetto comunque che il grosso del tempo siano le millemila chiamate al codice JavaScript della pagina.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    12
    Grazie per la risposta; ho provato il tuo codice ma è addirittura più lento di un paio di secondi...
    Speravo che C# offrisse un metodo più rapido per accedere agli elementi della collezione, ma sembrfa che non sia così, purtroppo.

  4. #4
    Fatico a credere che sia più lento... pari velocità sì, ma più lento mi suona davvero strano... Come hai effettuato le prove?
    In ogni caso, ti consiglio di usare un qualche genere di profiler per vedere dove si perde effettivamente tempo - se nello scorrere la collezione o nelle chiamate JavaScript. Ottimizzare senza sapere dove sono i bottleneck è semplicemente un esercizio di perdita di tempo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    qui di c# vedo poco ritengo sia interfaccia con ie a essere lunga e lenta.
    la butto lì salvare la pagina html e parsare il file di testo e poi post-arlo?
    se invece hai davvero una pagina html in un browser con migliaia di elementi temo non ci sia tanto da. fare

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    12
    Beh, la misurazione è stata fatta molto grezzamente con l'orologio...
    Stavo pensando di trasformare la variabile var output in una List<> per poi utilizzare i metodi tipo FindIndex, ma non ci riesco.
    Qualche idea?

  7. #7
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Sì, misura questo ciclo togliendo i vari "pezzi"
    codice:
      if (output[i].InnerText.Contains("testo da cercare"))
                            {
                                output[i].SetAttribute("selected", "true");
                                aggiungi.Click();
                                break;
                            }
    Cioè misura
    Togli aggiungi.click
    misura
    togli il setattribute
    misura
    togli tutto il ciclo

    Perchè essendoci un "break" al primo match positivo si blocca.

    Individua se è lento il ciclo (per ogni elemento ritornato, nel qual caso hai poco da fare), oppure se è lenta la ricerca del testo che vuoi.

    Altrimenti, se capisco bene la semantica di quello che vuoi fare, stai cercando di flaggare una checkbox automaticamente da programma. Ma poi, cosa succede?
    L'utente continua a poter "paciugare", o la pagina viene submitata o qualcosa del genere?
    Nel secondo caso potresti, come accennato, "compilartela in separata sede".

    QUindi la domanda è: cosa vuoi fare, esattamente?
    Ultima modifica di MySQL; 15-06-2015 a 14:36

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    12
    Voglio:
    - selezionare un'opzione da una drop-down;
    - premere submit.
    Riesco a fare tutto in automatico programmaticamente ma con una lentezza mostruosa.
    Da qui l'idea di usare una List<>, ma non riesco a fare i cast giusti.
    Non è che salvando la pagina per poi parsarla incappo nella stessa lentezza?
    Ultima modifica di thinking; 15-06-2015 a 14:39

  9. #9
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Quote Originariamente inviata da thinking Visualizza il messaggio
    Voglio:
    - selezionare un'opzione da una drop-down;
    - premere submit.
    Riesco a fare tutto in automatico programmaticamente ma con una lentezza mostruosa.
    Da qui l'idea di usare una List<>, ma non riesco a fare i cast giusti.
    Non è che salvando la pagina per poi parsarla incappo nella stessa lentezza?
    Non direi, perchè la pagina alla fin fine diventerà HTML, quindi testo, ci metterai pochi millesimi di secondi a "manipolarla".
    Poi però devi individuare COME fare il submit (un POST? un GET se hai mooolta fortuna?).
    Monitorizza con firebug o qualcosa del genere cosa succede quando premi "invio" per capire se è un delirio oppure è più semplice.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    12
    Premesso che non ho idea di cosa esattamente voglia dire "salvare la pagina html e parsare il file di testo e poi post-arlo", a me basta trovare l'indice del''array contenente il testo che sto cercando, perchè poi il resto del codice è molto efficiente.
    Saresti così gentile da darmi qualche dritta in più su ciò che intendi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.