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

List:       kde-frameworks-devel
Subject:    Re: Review Request 127236: Leverage QDir to know what's in a KIconThemeDir
From:       Nick Shaforostoff <shafff () ukr ! net>
Date:       2016-03-14 15:54:20
Message-ID: 20160314155420.22520.59364 () mimi ! kde ! org
[Download RAW message or body]

--===============7220582740806681975==
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit



> On March 1, 2016, 4:37 p.m., Aleix Pol Gonzalez wrote:
> > Eh... I just realized it's not 100% correct. We have a test \
> > (testUnknownIconNotCached) that fails, unsure how I didn't see it yesterday. 
> > The problem with this one is that we are not reacting when icons are introduced \
> > at runtime. I tried adding a sneaky QFileSystemWatcher/KDirWatch on KIconTheme \
> > but it didn't signal. 
> > Should I just discard the patch?
> 
> David Edmundson wrote:
> Could you compare modified time of mBaseDirThemeDir and reload if needed?
> it'd be one extra stat on the directory each time, but still a saving from before
> 
> Aleix Pol Gonzalez wrote:
> That doesn't work, for some reason...
> ```
> // Install the existing icon by copying.
> +        qDebug() << "xxxxxxxx1" << QFileInfo(actionIconsDir).lastModified();
> QVERIFY(QFile::copy(QStringLiteral(":/test-22x22.png"), newIconPath));
> +        qDebug() << "xxxxxxxx2" << QFileInfo(actionIconsDir).lastModified();
> ```
> 
> Both return the same value.
> 
> Nick Shaforostoff wrote:
> there is a difference between changing a file from inside the program and changing \
> it from outside. 
> did you make the change externally when testing QFileSystemWatcher-based solution?
> 
> Nick Shaforostoff wrote:
> also for the QFileInfo::lastModified() there may be just not enough time between \
> the tests, so try adding a 2-minute sleep there 
> David Faure wrote:
> QFileInfo::lastModified() doesn't include milliseconds yet. There is a pending \
> patch for Qt to implement that (as part of a much bigger task which also adds \
> QFile::setFileTime()), but yeah, that's the problem. Right now you need a 1s sleep \
> whenever unittesting changes to lastModified(). 
> QTest::qWait(1000); // remove this once lastModified includes ms
> 
> Or at least "up to 1s, until the end of the current second", I have code for that \
> in the kdirwatch unittest for instance. 
> Another alternative, hacking the modification time on files (using utime, like I do \
> in ksycocatest.cpp) 
> (all this to avoid tests that take 15 seconds in total, I like the policy that a \
> test should run in under 5s -- otherwise people stop running them) 
> Nick Shaforostoff wrote:
> so, any news on this one?

even simple solution of discarding the cache after certain point of time (e.g. 10 \
seconds) and going uncached code path would give us the benefit without introducing \
regression, right?


- Nick


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


On March 1, 2016, 3:25 a.m., Aleix Pol Gonzalez wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/127236/
> -----------------------------------------------------------
> 
> (Updated March 1, 2016, 3:25 a.m.)
> 
> 
> Review request for KDE Frameworks and Christoph Feck.
> 
> 
> Repository: kiconthemes
> 
> 
> Description
> -------
> 
> At the moment we're playing Battleship to see if an icon is present in a \
> subdirectory. This means that we are checking on every directory if there's an icon \
> that matches the size with a said name on every request. 
> This can be seen easily with strace:
> ```
> $ strace kwrite |& grep ENOENT | wc -l
> 6212
> ```
> After the patch: 
> ```
> $ strace kwrite |& grep ENOENT | wc -l
> 1993
> ```
> We reduce these accesses to let QDir keep the list of files inside the directory \
> (that was already being generated at some point, it just was being discarded). 
> 
> Diffs
> -----
> 
> src/kicontheme.cpp 0996054 
> 
> Diff: https://git.reviewboard.kde.org/r/127236/diff/
> 
> 
> Testing
> -------
> 
> Builds, tests still pass, applications start noticeably faster.
> 
> 
> Thanks,
> 
> Aleix Pol Gonzalez
> 
> 


--===============7220582740806681975==
MIME-Version: 1.0
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 7bit




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





<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: \
10px;">  <p style="margin-top: 0;">On March 1st, 2016, 4:37 p.m. UTC, <b>Aleix Pol \
Gonzalez</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;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Eh... I just realized it's not 100% correct. We have a \
test (testUnknownIconNotCached) that fails, unsure how I didn't see it yesterday.</p> \
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">The problem with this one is that we are not reacting \
when icons are introduced at runtime. I tried adding a sneaky \
QFileSystemWatcher/KDirWatch on KIconTheme but it didn't signal.</p> <p \
style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: \
inherit;">Should I just discard the patch?</p></pre>  </blockquote>




 <p>On March 1st, 2016, 5:42 p.m. UTC, <b>David Edmundson</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">Could \
you compare modified time of mBaseDirThemeDir and reload if needed? it'd be one extra \
stat on the directory each time, but still a saving from before</p></pre>  \
</blockquote>





 <p>On March 1st, 2016, 7:07 p.m. UTC, <b>Aleix Pol Gonzalez</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">That \
doesn't work, for some reason...</p> <p style="padding: 0;text-rendering: \
inherit;margin: 0;line-height: inherit;white-space: inherit;"><div class="codehilite" \
style="background: #f8f8f8"><pre style="line-height: 125%">         <span \
style="color: #666666">//</span> <span style="color: #008000; font-weight: \
bold">Install</span> <span style="color: #008000; font-weight: bold">the</span> <span \
style="color: #008000; font-weight: bold">existing</span> <span style="color: \
#008000; font-weight: bold">icon</span> <span style="color: #008000; font-weight: \
bold">by</span> <span style="color: #008000; font-weight: bold">copying</span><span \
style="color: #666666">.</span> <span style="color: #666666">+</span>        <span \
style="color: #008000; font-weight: bold">qDebug</span><span style="color: \
#666666">()</span> <span style="color: #666666">&lt;&lt;</span> <span style="color: \
#BA2121">&quot;xxxxxxxx1&quot;</span> <span style="color: #666666">&lt;&lt;</span> \
<span style="color: #008000; font-weight: bold">QFileInfo</span><span style="color: \
#666666">(</span><span style="color: #008000; font-weight: \
bold">actionIconsDir</span><span style="color: #666666">)</span><span style="color: \
#0000FF; font-weight: bold">.lastModified</span><span style="color: \
#666666">();</span>  <span style="color: #008000; font-weight: \
bold">QVERIFY</span><span style="color: #666666">(</span><span style="color: #008000; \
font-weight: bold">QFile</span><span style="color: #666666">:</span><span \
style="color: #AA22FF">:copy</span><span style="color: #666666">(</span><span \
style="color: #008000; font-weight: bold">QStringLiteral</span><span style="color: \
#666666">(</span><span style="color: \
#BA2121">&quot;:/test-22x22.png&quot;</span><span style="color: #666666">),</span> \
<span style="color: #008000; font-weight: bold">newIconPath</span><span style="color: \
#666666">));</span> <span style="color: #666666">+</span>        <span style="color: \
#008000; font-weight: bold">qDebug</span><span style="color: #666666">()</span> <span \
style="color: #666666">&lt;&lt;</span> <span style="color: \
#BA2121">&quot;xxxxxxxx2&quot;</span> <span style="color: #666666">&lt;&lt;</span> \
<span style="color: #008000; font-weight: bold">QFileInfo</span><span style="color: \
#666666">(</span><span style="color: #008000; font-weight: \
bold">actionIconsDir</span><span style="color: #666666">)</span><span style="color: \
#0000FF; font-weight: bold">.lastModified</span><span style="color: \
#666666">();</span> </pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Both return the same value.</p></pre>  </blockquote>





 <p>On March 1st, 2016, 9:06 p.m. UTC, <b>Nick Shaforostoff</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">there \
is a difference between changing a file from inside the program and changing it from \
outside.</p> <p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">did you make the change externally when testing \
QFileSystemWatcher-based solution?</p></pre>  </blockquote>





 <p>On March 1st, 2016, 9:12 p.m. UTC, <b>Nick Shaforostoff</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">also \
for the QFileInfo::lastModified() there may be just not enough time between the \
tests, so try adding a 2-minute sleep there</p></pre>  </blockquote>





 <p>On March 2nd, 2016, 8:28 a.m. UTC, <b>David Faure</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: \
inherit;">QFileInfo::lastModified() doesn't include milliseconds yet. There is a \
pending patch for Qt to implement that (as part of a much bigger task which also adds \
QFile::setFileTime()), but yeah, that's the problem. Right now you need a 1s sleep \
whenever unittesting changes to lastModified().</p> <p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div \
class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%"><span \
style="color: #008000; font-weight: bold">QTest</span><span style="color: \
#666666">:</span><span style="color: #AA22FF">:qWait</span><span style="color: \
#666666">(</span><span style="color: #008000; font-weight: bold">1000</span><span \
style="color: #666666">);</span> <span style="color: #666666">//</span> <span \
style="color: #008000; font-weight: bold">remove</span> <span style="color: #008000; \
font-weight: bold">this</span> <span style="color: #008000; font-weight: \
bold">once</span> <span style="color: #008000; font-weight: bold">lastModified</span> \
<span style="color: #008000; font-weight: bold">includes</span> <span style="color: \
#008000; font-weight: bold">ms</span> </pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Or at least "up to 1s, until the end of the current \
second", I have code for that in the kdirwatch unittest for instance.</p> <p \
style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: \
inherit;">Another alternative, hacking the modification time on files (using utime, \
like I do in ksycocatest.cpp)</p> <p style="padding: 0;text-rendering: \
inherit;margin: 0;line-height: inherit;white-space: inherit;">(all this to avoid \
tests that take 15 seconds in total, I like the policy that a test should run in \
under 5s -- otherwise people stop running them)</p></pre>  </blockquote>





 <p>On March 14th, 2016, 3:51 p.m. UTC, <b>Nick Shaforostoff</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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">so, \
any news on this one?</p></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;"><p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;">even \
simple solution of discarding the cache after certain point of time (e.g. 10 seconds) \
and going uncached code path would give us the benefit without introducing \
regression, right?</p></pre> <br />










<p>- Nick</p>


<br />
<p>On March 1st, 2016, 3:25 a.m. UTC, Aleix Pol Gonzalez wrote:</p>








<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="12" style="border: \
1px #888a85 solid; border-radius: 6px; -moz-border-radius: 6px; \
-webkit-border-radius: 6px;">  <tr>
  <td>

<div>Review request for KDE Frameworks and Christoph Feck.</div>
<div>By Aleix Pol Gonzalez.</div>


<p style="color: grey;"><i>Updated March 1, 2016, 3:25 a.m.</i></p>









<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
kiconthemes
</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;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">At the moment we're playing Battleship to see if an \
icon is present in a subdirectory. This means that we are checking on every directory \
if there's an icon that matches the size with a said name on every request.</p> <p \
style="padding: 0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: \
inherit;">This can be seen easily with strace:</p> <p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div \
class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%"><span \
style="color: #19177C">$ </span>strace kwrite |&amp; grep ENOENT | wc -l 6212
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">After the patch: </p> <p style="padding: \
0;text-rendering: inherit;margin: 0;line-height: inherit;white-space: inherit;"><div \
class="codehilite" style="background: #f8f8f8"><pre style="line-height: 125%"><span \
style="color: #19177C">$ </span>strace kwrite |&amp; grep ENOENT | wc -l 1993
</pre></div>
</p>
<p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">We reduce these accesses to let QDir keep the list of \
files inside the directory (that was already being generated at some point, it just \
was being discarded).</p></pre>  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </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;"><p style="padding: 0;text-rendering: inherit;margin: 0;line-height: \
inherit;white-space: inherit;">Builds, tests still pass, applications start \
noticeably faster.</p></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>src/kicontheme.cpp <span style="color: grey">(0996054)</span></li>

</ul>

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






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







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


--===============7220582740806681975==--


[Attachment #3 (text/plain)]

_______________________________________________
Kde-frameworks-devel mailing list
Kde-frameworks-devel@kde.org
https://mail.kde.org/mailman/listinfo/kde-frameworks-devel


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

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