Results 1 to 19 of 19

Thread: Understanding why these few lines are slow

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Sep 2010
    Location
    Germany
    Posts
    28
    Thanks
    1
    Thanked 4 Times in 4 Posts
    Qt products
    Qt4 Qt/Embedded
    Platforms
    Unix/X11 Windows Symbian S60

    Default Re: Understanding why these few lines are slow

    Try this :

    Qt Code:
    1. QList<QUrl> urlList = event->mimeData()->urls();
    2.  
    3. for (QList<QUrl>::const_iterator i = urlList.begin();
    4. i != urlList.end();
    5. i++)
    6. {
    7. QString strFile2 = (*i).toString();
    8. if (strFile2.endsWith(".png") || strFile2.endsWith(".gif")) {
    9. QString strFile1 = strFile2.mid(7, strFile2.length() - 2);
    10. ui->listWidget->addItem(strFile1);
    11. }
    12. }
    To copy to clipboard, switch view to plain text mode 

  2. The following user says thank you to Sven for this useful post:

    hakermania (5th February 2011)

  3. #2
    Join Date
    Jan 2006
    Location
    Germany
    Posts
    4,380
    Thanks
    19
    Thanked 1,005 Times in 913 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60
    Wiki edits
    5

    Default Re: Understanding why these few lines are slow

    Quote Originally Posted by Sven View Post
    Try this
    We should encourage people to think about problems and to came up with a solution of their own. There is no benefit of simply paste a better code/solution. Furthermore, can you explain me the meaning of subtraction of 2 in this line:
    Qt Code:
    1. QString strFile1 = strFile2.mid(7, strFile2.length() - 2);
    To copy to clipboard, switch view to plain text mode 
    ?

  4. The following user says thank you to Lykurg for this useful post:

    hakermania (5th February 2011)

  5. #3
    Join Date
    Sep 2010
    Location
    Germany
    Posts
    28
    Thanks
    1
    Thanked 4 Times in 4 Posts
    Qt products
    Qt4 Qt/Embedded
    Platforms
    Unix/X11 Windows Symbian S60

    Default Re: Understanding why these few lines are slow

    Quote Originally Posted by Lykurg View Post
    We should encourage people to think about problems and to came up with a solution of their own. There is no benefit of simply paste a better code/solution. Furthermore, can you explain me the meaning of subtraction of 2 in this line:
    Qt Code:
    1. QString strFile1 = strFile2.mid(7, strFile2.length() - 2);
    To copy to clipboard, switch view to plain text mode 
    ?
    Ok I have looked into the code again and i see that this makes no sense. For example we have got:



    So , i guess he wants to remove the http:// and the extension ?
    If so, that
    Qt Code:
    1. QString strFile1 = strFile2.mid(7, strFile2.length() - 2);
    To copy to clipboard, switch view to plain text mode 

    makes no sense. Maybe this solution would be better: (we have checked already for .png and .gif, so this should be correct)

    Qt Code:
    1. QString strFile1 = strFile2.mid(7, strFile2.lastIndexOf("."));
    To copy to clipboard, switch view to plain text mode 

  6. The following user says thank you to Sven for this useful post:

    hakermania (5th February 2011)

  7. #4
    Join Date
    Jan 2006
    Location
    Germany
    Posts
    4,380
    Thanks
    19
    Thanked 1,005 Times in 913 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Symbian S60
    Wiki edits
    5

    Default Re: Understanding why these few lines are slow

    To say it: First parameter indicates the starting point, last the length of the "resulting" string, so strFile2.length() - 2 is too long since only strFile2.length() - 7 left. Thus one should simply pass -1 as a last parameter. That is what I was trying to tell. Furthermore QString::remove()is probably better for his intention - I guess.

  8. #5
    Join Date
    Jul 2010
    Location
    /home/hakermania/
    Posts
    233
    Thanks
    129
    Thanked 3 Times in 3 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11

    Default Re: Understanding why these few lines are slow

    Thank all of you, Sven's solution worked, but Lykurg's right, I don't understand why the code provided is better than my first posted, so i really want to understand my mistake in order to avoid it to the feature?
    When you 're trying to help somebody in the newbie section, don't forget that he is a newbie. Be specific and give examples.

  9. #6
    Join Date
    Jan 2008
    Location
    Alameda, CA, USA
    Posts
    5,321
    Thanks
    316
    Thanked 871 Times in 858 Posts
    Qt products
    Qt5
    Platforms
    Windows

    Default Re: Understanding why these few lines are slow

    Here's your original code:

    Qt Code:
    1. for(int i=1; i<=event->mimeData()->urls().length(); i++){
    2. item=new QListWidgetItem;
    3. QUrl url = event->mimeData()->urls().takeAt(i-1);
    4. QString file2 = url.toString();
    5. QString file1 = file2.mid(7,file2.length()-2); //removing some things I don't want
    6. QString extension = file1.right(3); //taking last 3 letters from the string..
    7. if(extension=="png" || extension=="gif"){ //add to the listwidget
    8. item->setText(file1);
    9. ui->listWidget->addItem(item);
    10. }
    11. }
    To copy to clipboard, switch view to plain text mode 

    I don't understand why the code provided is better than my first posted, so i really want to understand my mistake in order to avoid it to the feature?
    And so you're saying you still don't understand why it runs so slowly?

    OK, others have pointed this out, but maybe it wasn't clear. Aside from all the strange stuff you are doing to the string once you get it out of the URL, the main reason why your original code runs slowly is this:

    Qt Code:
    1. event->mimeData()->urls()
    To copy to clipboard, switch view to plain text mode 

    You're calling this string of methods *twice* for every time through the loop, once when counting the length of the urls in the for statement, and again when you retrieve the QUrl.

    You're making three method calls in that single line: retrieving the mimeData from the event, then retrieving the urls from the mimeData, then doing something with the urls (like getting the length or a specific URL).

    One (or more) of those three calls is very time intensive. Maybe it's getting the mimeData from the event, maybe it's parsing the mimeData to retrieve the URLs. Doesn't matter. It's the cause of the slowness. String manipulations and comparisons are blindingly fast compared to that.

    What does matter is that information is what is called "loop invariant". It is essentially a constant for the entire duration of the loop. So, move it outside the loop as Sven first suggested. Then, you retrieve the mimeData from the event exactly once, and you parse the mimeData into the urls exactly once, and all the rest of the loop simply deals with the urls collection. If I were writing it, I'd even retrieve the urls length into a local variable (int nUrls = urls.length()) and use that as the loop termination condition instead of calling length() repeatedly. I'd also use a more descriptive name for the loop iterator (instead of a generic "i") so that next time I read the code, it is clear to me that I am iterating over urls and not something else.

    Qt Code:
    1. const QList<QUrl> & urlList = event->mimeData()->urls();
    2. int nUrls = urlList.length();
    3.  
    4. for ( int nUrl = 0; nUrl < nUrls; nUrl++)
    5. {
    6. // ...
    7. }
    To copy to clipboard, switch view to plain text mode 

    Hope this helps. No flames please from those who would complain that I'm "doing someone's homework". I think the OP really doesn't understand why his original code is slow despite all the other help.

  10. The following user says thank you to d_stranz for this useful post:

    hakermania (6th February 2011)

  11. #7
    Join Date
    Jan 2009
    Location
    Germany
    Posts
    131
    Thanks
    11
    Thanked 16 Times in 16 Posts
    Qt products
    Qt3 Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Understanding why these few lines are slow

    I also like foreach because its easy to use, avoids unnecessary copying and very readable and the performance is ok:

    Qt Code:
    1. foreach(const QUrl& url, event->mimeData()->urls()) {
    2. //work
    3. }
    To copy to clipboard, switch view to plain text mode 

  12. #8
    Join Date
    Sep 2010
    Location
    Poland
    Posts
    112
    Thanks
    8
    Thanked 3 Times in 3 Posts
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows Maemo/MeeGo

    Default Re: Understanding why these few lines are slow

    As the documentation says
    Qt automatically takes a copy of the container
    .

    So make me correct, but isn't foreach loop something useful when iterating through the container holding pointers not entire objects, because in other way we use 2 times original_container_size amount of memory ?
    My schedule makes my cry
    My works makes my laugh
    My life makes... oh...no....

  13. #9
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,368
    Thanks
    3
    Thanked 5,018 Times in 4,794 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: Understanding why these few lines are slow

    Quote Originally Posted by kornicameister View Post
    As the documentation says .

    So make me correct, but isn't foreach loop something useful when iterating through the container holding pointers not entire objects, because in other way we use 2 times original_container_size amount of memory ?
    It depends on the container. All Qt containers are implcitly shared so only a shallow copy of the container is made, the real data is not copied. If you create your own container (or use some 3rd party code) that doesn't share data between its copies then foreach will cause an immediate overhead in both memory and time because the container will have to be copied.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


Similar Threads

  1. Understanding RGB888
    By scarleton in forum Qt Programming
    Replies: 6
    Last Post: 29th August 2010, 20:03
  2. Having trouble understanding brush
    By feraudyh in forum Newbie
    Replies: 4
    Last Post: 30th July 2010, 18:18
  3. Better understanding of the ModelView archtecture
    By scarleton in forum Qt Programming
    Replies: 6
    Last Post: 28th June 2010, 07:07
  4. Help understanding QWT Contour Plot
    By jwieland in forum Qwt
    Replies: 11
    Last Post: 7th December 2009, 06:47
  5. I need help understanding QGraphicsView
    By aarelovich in forum Qt Programming
    Replies: 13
    Last Post: 22nd July 2009, 20:02

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.