[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kwrite-devel
Subject:    Re: Review Request 115976: Wildcard-like search string + edit distance-based sorting for Quick Open
From:       "Milian Wolff" <mail () milianw ! de>
Date:       2014-02-24 8:58:39
Message-ID: 20140224085839.25983.80339 () probe ! kde ! org
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


> On Feb. 23, 2014, 6:57 p.m., Sven Brauch wrote:
> > We're starting to have a lot of those algorithms now -- kdevelop has one for \
> > quickopen, kate has one for the completion list and now one for quickopen too. \
> > Maybe we could determine some shared functionality and put it in KTextEditor for \
> > all three places to re-use? We'd just need to discus what functionality that \
> > would be. 
> > Apart from that, my experience from kdevelop's quickopen is that arbitrary \
> > distance of characters easily yields weird results when applied to longer paths. \
> > But maybe that's fixed by your sorting algorithm. 
> > Does kate's quickopen filter all files when you have a project open, or always \
> > just open files? In the former case, is the regex approach fast enough?
> 
> Kirill Bogdanenko wrote:
> > Does kate's quickopen filter all files when you have a project open, or always \
> > just open files? In the former case, is the regex approach fast enough?
> 
> quickopen filter is applied to all documents that are available, these are:
> 1. Views
> 2. Opened documents
> 3. Project files
> (for details see KateQuickOpen::update method in kate/app/katequickopen.cpp)
> 
> In the case regex approach is fast enough (but actually can be replaced by wildcard \
> otherwise). At least I hadn't experienced any slowdowns on kate.git project on my \
> laptop (dual-core i7-2640M, 8 GiB RAM). But I haven't done any real benchmarks. 
> Kirill Bogdanenko wrote:
> ... but probably it's worth to override filter's filterAcceptsRow() method and get \
> rid of regexp matching. 
> Algorhithm can be like as follows:
> 
> int lastPos = -1;
> 
> for (int i = pattern.length() - 1; i >= 0; i--) {
> int pos = candidate.lastIndexOf(pattern[i], lastPos);
> if (pos != -1) {
> lastPos = pos;
> } else {
> return false;
> }
> }
> 
> Can you advice some benchmarking tool that will help to compare these approaches?
> 
> Sven Brauch wrote:
> Milian is the resident expert on benchmarks around here, but if you write a unit \
> test (which is always awesome anyways) you can easily use QBENCHMARK to compare the \
> approaches. A simpler method is just putting QTime t; t.start; [do stuff] qDebug() \
> << t.elapsed() around your code. More serious benchmarking can use valgrind \
> --tool=cachegrind or intel's vtune, but I doubt that's worth it in this case.

Jup, a QBENCHMARK would be greatly appreciated. 

QElapsedTimer based "profiling" is only a good tool to quickly verify hotspots found \
by other means, such as perf, callgrind or vtune. A QBENCHMARK is still needed in \
order to systematically improve performance and ensure that no performance \
regressions creep in.


- Milian


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/115976/#review50608
-----------------------------------------------------------


On Feb. 23, 2014, 6:44 p.m., Kirill Bogdanenko wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/115976/
> -----------------------------------------------------------
> 
> (Updated Feb. 23, 2014, 6:44 p.m.)
> 
> 
> Review request for Kate, Christoph Cullmann and Dominik Haumann.
> 
> 
> Bugs: 328569
> http://bugs.kde.org/show_bug.cgi?id=328569
> 
> 
> Repository: kate
> 
> 
> Description
> -------
> 
> Wildcard-like search string for Quick Open
> 
> * Search string turns into regexp like:
> 
> foo -> /f.*o.*o.*$/
> 
> (special characters in original pattern are escaped)
> 
> * Filtered items are sorted using edit (Levenstein) distance
> 
> 
> Diffs
> -----
> 
> kate/app/CMakeLists.txt f39bf68 
> kate/app/katequickopen.h 175826e 
> kate/app/katequickopen.cpp 235f9f1 
> kate/app/katequickopenproxymodel.h PRE-CREATION 
> kate/app/katequickopenproxymodel.cpp PRE-CREATION 
> 
> Diff: https://git.reviewboard.kde.org/r/115976/diff/
> 
> 
> Testing
> -------
> 
> 
> Thanks,
> 
> Kirill Bogdanenko
> 
> 


[Attachment #5 (text/html)]

<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 \
solid;">  <tr>
     <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="https://git.reviewboard.kde.org/r/115976/">https://git.reviewboard.kde.org/r/115976/</a>
  </td>
    </tr>
   </table>
   <br />





<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On February 23rd, 2014, 6:57 p.m. UTC, <b>Sven \
Brauch</b> wrote:</p>  <blockquote style="margin-left: 1em; border-left: 2px solid \
#d0d0d0; padding-left: 10px;">  <pre style="white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">We&#39;re starting to have a lot of those algorithms now -- kdevelop has \
one for quickopen, kate has one for the completion list and now one for quickopen \
too. Maybe we could determine some shared functionality and put it in KTextEditor for \
all three places to re-use? We&#39;d just need to discus what functionality that \
would be.

Apart from that, my experience from kdevelop&#39;s quickopen is that arbitrary \
distance of characters easily yields weird results when applied to longer paths. But \
maybe that&#39;s fixed by your sorting algorithm.

Does kate&#39;s quickopen filter all files when you have a project open, or always \
just open files? In the former case, is the regex approach fast enough?</pre>  \
</blockquote>




 <p>On February 23rd, 2014, 10:26 p.m. UTC, <b>Kirill Bogdanenko</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">&gt; Does kate&#39;s \
quickopen filter all files when you have a project open, or always just open files? \
In the former case, is the regex approach fast enough?

quickopen filter is applied to all documents that are available, these are:
1. Views
2. Opened documents
3. Project files
(for details see KateQuickOpen::update method in kate/app/katequickopen.cpp)

In the case regex approach is fast enough (but actually can be replaced by wildcard \
otherwise). At least I hadn&#39;t experienced any slowdowns on kate.git project on my \
laptop (dual-core i7-2640M, 8 GiB RAM). But I haven&#39;t done any real \
benchmarks.</pre>  </blockquote>





 <p>On February 23rd, 2014, 10:48 p.m. UTC, <b>Kirill Bogdanenko</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">... but probably \
it&#39;s worth to override filter&#39;s filterAcceptsRow() method and get rid of \
regexp matching.

Algorhithm can be like as follows:

  int lastPos = -1;

  for (int i = pattern.length() - 1; i &gt;= 0; i--) {
      int pos = candidate.lastIndexOf(pattern[i], lastPos);
      if (pos != -1) {
          lastPos = pos;
      } else {
          return false;
      }
  }

Can you advice some benchmarking tool that will help to compare these \
approaches?</pre>  </blockquote>





 <p>On February 23rd, 2014, 11:39 p.m. UTC, <b>Sven Brauch</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Milian is the resident \
expert on benchmarks around here, but if you write a unit test (which is always \
awesome anyways) you can easily use QBENCHMARK to compare the approaches. A simpler \
method is just putting QTime t; t.start; [do stuff] qDebug() &lt;&lt; t.elapsed() \
around your code. More serious benchmarking can use valgrind --tool=cachegrind or \
intel&#39;s vtune, but I doubt that&#39;s worth it in this case.</pre>  </blockquote>








</blockquote>

<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: \
-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Jup, a QBENCHMARK would \
be greatly appreciated. 

QElapsedTimer based &quot;profiling&quot; is only a good tool to quickly verify \
hotspots found by other means, such as perf, callgrind or vtune. A QBENCHMARK is \
still needed in order to systematically improve performance and ensure that no \
performance regressions creep in.</pre> <br />










<p>- Milian</p>


<br />
<p>On February 23rd, 2014, 6:44 p.m. UTC, Kirill Bogdanenko wrote:</p>








<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" \
style="background-image: \
url('https://git.reviewboard.kde.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); \
background-position: left top; background-repeat: repeat-x; border: 1px black \
solid;">  <tr>
  <td>

<div>Review request for Kate, Christoph Cullmann and Dominik Haumann.</div>
<div>By Kirill Bogdanenko.</div>


<p style="color: grey;"><i>Updated Feb. 23, 2014, 6:44 p.m.</i></p>







<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Bugs: </b>


 <a href="http://bugs.kde.org/show_bug.cgi?id=328569">328569</a>


</div>



<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
kate
</div>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
 <table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" \
style="border: 1px solid #b8b5a0">  <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: \
-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: \
break-word;">Wildcard-like search string for Quick Open

* Search string turns into regexp like:

    foo -&gt; /f.*o.*o.*$/

  (special characters in original pattern are escaped)

* Filtered items are sorted using edit (Levenstein) distance
</pre>
  </td>
 </tr>
</table>



<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>kate/app/CMakeLists.txt <span style="color: grey">(f39bf68)</span></li>

 <li>kate/app/katequickopen.h <span style="color: grey">(175826e)</span></li>

 <li>kate/app/katequickopen.cpp <span style="color: grey">(235f9f1)</span></li>

 <li>kate/app/katequickopenproxymodel.h <span style="color: \
grey">(PRE-CREATION)</span></li>

 <li>kate/app/katequickopenproxymodel.cpp <span style="color: \
grey">(PRE-CREATION)</span></li>

</ul>

<p><a href="https://git.reviewboard.kde.org/r/115976/diff/" style="margin-left: \
3em;">View Diff</a></p>







  </td>
 </tr>
</table>








  </div>
 </body>
</html>



_______________________________________________
KWrite-Devel mailing list
KWrite-Devel@kde.org
https://mail.kde.org/mailman/listinfo/kwrite-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic