<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[266272] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/266272">266272</a></dd>
<dt>Author</dt> <dd>lmoura@igalia.com</dd>
<dt>Date</dt> <dd>2020-08-27 20:24:23 -0700 (Thu, 27 Aug 2020)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/266221">r266221</a>) Layout tests step hanging due to slow WaveDiff comparison
https://bugs.webkit.org/show_bug.cgi?id=215886

Reviewed by Darin Adler.

After <a href="http://trac.webkit.org/projects/webkit/changeset/266221">r266221</a>, a couple of webaudio tests generated WAV files with a
small difference in a large number of samples. This caused the
WaveDiff comparison to take too long.

While it works fine for small diffs, this ends up creating repeatedly
large strings for each concatenation, bringing the comparisons to a
halt.

Instead of relying on string concatenation, use a list to collect then
and only concat when actually retrieving the full string.

* Scripts/webkitpy/common/wavediff.py:
(WaveDiff.__init__):
(WaveDiff._diffParam):
(WaveDiff._diffSample):
(WaveDiff.diffText):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpycommonwavediffpy">trunk/Tools/Scripts/webkitpy/common/wavediff.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (266271 => 266272)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog    2020-08-28 03:07:06 UTC (rev 266271)
+++ trunk/Tools/ChangeLog       2020-08-28 03:24:23 UTC (rev 266272)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2020-08-27  Lauro Moura  <lmoura@igalia.com>
+
+        REGRESSION(r266221) Layout tests step hanging due to slow WaveDiff comparison
+        https://bugs.webkit.org/show_bug.cgi?id=215886
+
+        Reviewed by Darin Adler.
+
+        After r266221, a couple of webaudio tests generated WAV files with a
+        small difference in a large number of samples. This caused the
+        WaveDiff comparison to take too long.
+
+        While it works fine for small diffs, this ends up creating repeatedly
+        large strings for each concatenation, bringing the comparisons to a
+        halt.
+
+        Instead of relying on string concatenation, use a list to collect then
+        and only concat when actually retrieving the full string.
+
+        * Scripts/webkitpy/common/wavediff.py:
+        (WaveDiff.__init__):
+        (WaveDiff._diffParam):
+        (WaveDiff._diffSample):
+        (WaveDiff.diffText):
+
</ins><span class="cx"> 2020-08-27  Carlos Alberto Lopez Perez  <clopez@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         [webkitpy] repository svn version is incorrect when working on a branch
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpycommonwavediffpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/common/wavediff.py (266271 => 266272)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/common/wavediff.py  2020-08-28 03:07:06 UTC (rev 266271)
+++ trunk/Tools/Scripts/webkitpy/common/wavediff.py     2020-08-28 03:24:23 UTC (rev 266272)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">         params1 = waveFile1.getparams()
</span><span class="cx">         params2 = waveFile2.getparams()
</span><span class="cx"> 
</span><del>-        self._diff = ''
</del><ins>+        self._diff = []
</ins><span class="cx"> 
</span><span class="cx">         self._filesAreIdentical = not sum(map(self._diffParam, params1, params2, self._paramNames))
</span><span class="cx">         self._filesAreIdenticalWithinTolerance = self._filesAreIdentical
</span><span class="lines">@@ -72,19 +72,19 @@
</span><span class="cx">         self._filesAreIdenticalWithinTolerance = not len(list(filter(lambda x: x > self._tolerance, results)))
</span><span class="cx"> 
</span><span class="cx">         if differingSampleCount:
</span><del>-            self._diff += '\n'
-            self._diff += 'Total differing samples: %d\n' % differingSampleCount
-            self._diff += 'Percentage of differing samples: %0.3f%%\n' % (100 * float(differingSampleCount) / max(frameCount1, frameCount2))
-            self._diff += 'Cumulative sample difference: %d\n' % cumulativeSampleDiff
-            self._diff += 'Average sample difference: %f\n' % (float(cumulativeSampleDiff) / differingSampleCount)
</del><ins>+            self._diff.append('')
+            self._diff.append('Total differing samples: %d' % differingSampleCount)
+            self._diff.append('Percentage of differing samples: %0.3f%%' % (100 * float(differingSampleCount) / max(frameCount1, frameCount2)))
+            self._diff.append('Cumulative sample difference: %d' % cumulativeSampleDiff)
+            self._diff.append('Average sample difference: %f' % (float(cumulativeSampleDiff) / differingSampleCount))
</ins><span class="cx"> 
</span><span class="cx">     def _diffParam(self, param1, param2, paramName):
</span><span class="cx">         if param1 == param2:
</span><span class="cx">             return False
</span><del>-        self._diff += paramName + '\n'
-        self._diff += '< %s\n' % str(param1)
-        self._diff += '---\n'
-        self._diff += '> %s\n' % str(param2)
</del><ins>+        self._diff.append(paramName)
+        self._diff.append('< %s' % str(param1))
+        self._diff.append('---')
+        self._diff.append('> %s' % str(param2))
</ins><span class="cx">         return True
</span><span class="cx"> 
</span><span class="cx">     @staticmethod
</span><span class="lines">@@ -95,10 +95,10 @@
</span><span class="cx"> 
</span><span class="cx">     def _diffSample(self, data1, data2, i):
</span><span class="cx">         if (data1 != data2):
</span><del>-            self._diff += 'Sample #%d\n' % i
-            self._diff += '< %d\n' % data1
-            self._diff += '---\n'
-            self._diff += '> %d\n' % data2
</del><ins>+            self._diff.append('Sample #%d' % i)
+            self._diff.append('< %d' % data1)
+            self._diff.append('---')
+            self._diff.append('> %d' % data2)
</ins><span class="cx">         return abs(data1 - data2)
</span><span class="cx"> 
</span><span class="cx">     def filesAreIdentical(self):
</span><span class="lines">@@ -108,4 +108,4 @@
</span><span class="cx">         return self._filesAreIdenticalWithinTolerance
</span><span class="cx"> 
</span><span class="cx">     def diffText(self):
</span><del>-        return self._diff
</del><ins>+        return '\n'.join(self._diff)
</ins></span></pre>
</div>
</div>

</body>
</html>