Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-updates > by-pkgid > 1680fb88efc4e76ac8cb0ebf3578014f > files > 384

qtmultimedia5-doc-5.12.6-1.mga7.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>ClockCycleCounter.cpp Example File | Qt Multimedia 5.12.6</title>
  <link rel="stylesheet" type="text/css" href="style/offline-simple.css" />
  <script type="text/javascript">
    document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css");
    // loading style sheet breaks anchors that were jumped to before
    // so force jumping to anchor again
    setTimeout(function() {
        var anchor = location.hash;
        // need to jump to different anchor first (e.g. none)
        location.hash = "#";
        setTimeout(function() {
            location.hash = anchor;
        }, 0);
    }, 0);
  </script>
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="main">
    <div class="main-rounded">
      <div class="navigationbar">
        <table><tr>
<td >Qt 5.12</td><td ><a href="qtmultimedia-index.html">Qt Multimedia</a></td><td ><a href="qtmultimedia-multimedia-spectrum-example.html">Spectrum Example</a></td><td >ClockCycleCounter.cpp Example File</td></tr></table><table class="buildversion"><tr>
<td id="buildversion" width="100%" align="right"><a href="qtmultimedia-index.html">Qt 5.12.6 Reference Documentation</a></td>
        </tr></table>
      </div>
    </div>
<div class="content">
<div class="line">
<div class="content mainContent">
<div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div>
<h1 class="title">ClockCycleCounter.cpp Example File</h1>
<span class="subtitle">multimedia/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.cpp</span>
<!-- $$$multimedia/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.cpp-description -->
<div class="descr"> <a name="details"></a>
<pre class="cpp">

  <span class="comment">/*****************************************************************************

          ClockCycleCounter.cpp
          Copyright (c) 2003 Laurent de Soras

  --- Legal stuff ---

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  *Tab=3***********************************************************************/</span>

  <span class="preprocessor">#if defined (_MSC_VER)</span>
          <span class="preprocessor">#pragma warning (1 : 4130) // &quot;'operator' : logical operation on address of string constant&quot;</span>
          <span class="preprocessor">#pragma warning (1 : 4223) // &quot;nonstandard extension used : non-lvalue array converted to pointer&quot;</span>
          <span class="preprocessor">#pragma warning (1 : 4705) // &quot;statement has no effect&quot;</span>
          <span class="preprocessor">#pragma warning (1 : 4706) // &quot;assignment within conditional expression&quot;</span>
          <span class="preprocessor">#pragma warning (4 : 4786) // &quot;identifier was truncated to '255' characters in the debug information&quot;</span>
          <span class="preprocessor">#pragma warning (4 : 4800) // &quot;forcing value to bool 'true' or 'false' (performance warning)&quot;</span>
          <span class="preprocessor">#pragma warning (4 : 4355) // &quot;'this' : used in base member initializer list&quot;</span>
  <span class="preprocessor">#endif</span>

  <span class="comment">/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span>

  <span class="preprocessor">#include        &quot;ClockCycleCounter.h&quot;</span>

  <span class="preprocessor">#include        &lt;cassert&gt;</span>

  <span class="keyword">namespace</span> stopwatch
  {

  <span class="comment">/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span>

  <span class="comment">/*
  ==============================================================================
  Name: ctor
  Description:
          The first object constructed initialise global data. This first
          construction may be a bit slow.
  Throws: Nothing
  ==============================================================================
  */</span>

  ClockCycleCounter<span class="operator">::</span>ClockCycleCounter ()
  :       _start_time (<span class="number">0</span>)
  <span class="operator">,</span>       _state (<span class="number">0</span>)
  <span class="operator">,</span>       _best_score (<span class="operator">-</span><span class="number">1</span>)
  {
          <span class="keyword">if</span> (<span class="operator">!</span> _init_flag)
          {
                  <span class="comment">// Should be executed in this order</span>
                  compute_clk_mul ();
                  compute_measure_time_total ();
                  compute_measure_time_lap ();

                  <span class="comment">// Restores object state</span>
                  _start_time <span class="operator">=</span> <span class="number">0</span>;
                  _state      <span class="operator">=</span> <span class="number">0</span>;
                  _best_score <span class="operator">=</span> <span class="operator">-</span><span class="number">1</span>;

                  _init_flag <span class="operator">=</span> <span class="keyword">true</span>;
          }
  }

  <span class="comment">/*
  ==============================================================================
  Name: get_time_total
  Description:
          Gives the time elapsed between the latest stop_lap() and start() calls.
  Returns:
          The duration, in clock cycles.
  Throws: Nothing
  ==============================================================================
  */</span>

  Int64   ClockCycleCounter<span class="operator">::</span>get_time_total () <span class="keyword">const</span>
  {
          <span class="keyword">const</span> Int64             duration <span class="operator">=</span> _state <span class="operator">-</span> _start_time;
          assert (duration <span class="operator">&gt;</span><span class="operator">=</span> <span class="number">0</span>);

          <span class="keyword">const</span> Int64             t <span class="operator">=</span> max (
                  duration <span class="operator">-</span> _measure_time_total<span class="operator">,</span>
                  <span class="keyword">static_cast</span> <span class="operator">&lt;</span>Int64<span class="operator">&gt;</span> (<span class="number">0</span>)
          );

          <span class="keyword">return</span> (t <span class="operator">*</span> _clk_mul);
  }

  <span class="comment">/*
  ==============================================================================
  Name: get_time_best_lap
  Description:
          Gives the smallest time between two consecutive stop_lap() or between
          the stop_lap() and start(). The value is reset by a call to start().
          Call this function only after a stop_lap().
          The time is amputed from the duration of the stop_lap() call itself.
  Returns:
          The smallest duration, in clock cycles.
  Throws: Nothing
  ==============================================================================
  */</span>

  Int64   ClockCycleCounter<span class="operator">::</span>get_time_best_lap () <span class="keyword">const</span>
  {
          assert (_best_score <span class="operator">&gt;</span><span class="operator">=</span> <span class="number">0</span>);

          <span class="keyword">const</span> Int64             t1 <span class="operator">=</span> max (
                  _best_score <span class="operator">-</span> _measure_time_lap<span class="operator">,</span>
                  <span class="keyword">static_cast</span> <span class="operator">&lt;</span>Int64<span class="operator">&gt;</span> (<span class="number">0</span>)
          );
          <span class="keyword">const</span> Int64             t <span class="operator">=</span> min (t1<span class="operator">,</span> get_time_total ());

          <span class="keyword">return</span> (t <span class="operator">*</span> _clk_mul);
  }

  <span class="comment">/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span>

  <span class="comment">/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span>

  <span class="preprocessor">#if defined (__MACOS__)</span>

  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="type">double</span>    stopwatch_ClockCycleCounter_get_time_s ()
  {
          <span class="keyword">const</span> Nanoseconds       ns <span class="operator">=</span> AbsoluteToNanoseconds (UpTime ());

          <span class="keyword">return</span> (ns<span class="operator">.</span>hi <span class="operator">*</span> <span class="number">4294967296e</span><span class="operator">-</span><span class="number">9</span> <span class="operator">+</span> ns<span class="operator">.</span>lo <span class="operator">*</span> <span class="number">1e</span><span class="operator">-</span><span class="number">9</span>);
  }

  <span class="preprocessor">#endif  // __MACOS__</span>

  <span class="comment">/*
  ==============================================================================
  Name: compute_clk_mul
  Description:
          This function, only for PowerPC/MacOS computers, computes the multiplier
          required to deduce clock cycles from the internal counter.
  Throws: Nothing
  ==============================================================================
  */</span>

  <span class="type">void</span>    ClockCycleCounter<span class="operator">::</span>compute_clk_mul ()
  {
          assert (<span class="operator">!</span> _init_flag);

  <span class="preprocessor">#if defined (__MACOS__)</span>

          <span class="type">long</span>                            clk_speed_mhz <span class="operator">=</span> CurrentProcessorSpeed ();
          <span class="keyword">const</span> Int64             clk_speed <span class="operator">=</span>
                  <span class="keyword">static_cast</span> <span class="operator">&lt;</span>Int64<span class="operator">&gt;</span> (clk_speed_mhz) <span class="operator">*</span> (<span class="number">1000L</span><span class="operator">*</span><span class="number">1000L</span>);

          <span class="keyword">const</span> <span class="type">double</span>    start_time_s <span class="operator">=</span> stopwatch_ClockCycleCounter_get_time_s ();
          start ();

          <span class="keyword">const</span> <span class="type">double</span>    duration <span class="operator">=</span> <span class="number">0.01</span>;        <span class="comment">// Seconds</span>
          <span class="keyword">while</span> (stopwatch_ClockCycleCounter_get_time_s () <span class="operator">-</span> start_time_s <span class="operator">&lt;</span> duration)
          {
                  <span class="keyword">continue</span>;
          }

          <span class="keyword">const</span> <span class="type">double</span>    stop_time_s <span class="operator">=</span> stopwatch_ClockCycleCounter_get_time_s ();
          stop ();

          <span class="keyword">const</span> <span class="type">double</span>    diff_time_s <span class="operator">=</span> stop_time_s <span class="operator">-</span> start_time_s;
          <span class="keyword">const</span> <span class="type">double</span>    nbr_cycles <span class="operator">=</span> diff_time_s <span class="operator">*</span> <span class="keyword">static_cast</span> <span class="operator">&lt;</span><span class="type">double</span><span class="operator">&gt;</span> (clk_speed);

          <span class="keyword">const</span> Int64             diff_time_c <span class="operator">=</span> _state <span class="operator">-</span> _start_time;
          <span class="keyword">const</span> <span class="type">double</span>    clk_mul <span class="operator">=</span> nbr_cycles <span class="operator">/</span> <span class="keyword">static_cast</span> <span class="operator">&lt;</span><span class="type">double</span><span class="operator">&gt;</span> (diff_time_c);

          _clk_mul <span class="operator">=</span> round_int (clk_mul);

  <span class="preprocessor">#endif  // __MACOS__</span>
  }

  <span class="type">void</span>    ClockCycleCounter<span class="operator">::</span>compute_measure_time_total ()
  {
          start ();
          spend_time ();

          Int64                           best_result <span class="operator">=</span> <span class="number">0x7FFFFFFFL</span>;      <span class="comment">// Should be enough</span>
          <span class="type">long</span>                            nbr_tests <span class="operator">=</span> <span class="number">100</span>;
          <span class="keyword">for</span> (<span class="type">long</span> cnt <span class="operator">=</span> <span class="number">0</span>; cnt <span class="operator">&lt;</span> nbr_tests; <span class="operator">+</span><span class="operator">+</span>cnt)
          {
                  start ();
                  stop_lap ();
                  <span class="keyword">const</span> Int64             duration <span class="operator">=</span> _state <span class="operator">-</span> _start_time;
                  best_result <span class="operator">=</span> min (best_result<span class="operator">,</span> duration);
          }

          _measure_time_total <span class="operator">=</span> best_result;
  }

  <span class="comment">/*
  ==============================================================================
  Name: compute_measure_time_lap
  Description:
          Computes the duration of one stop_lap() call and store it. It will be used
          later to get the real duration of the measured operation (by substracting
          the measurement duration).
  Throws: Nothing
  ==============================================================================
  */</span>

  <span class="type">void</span>    ClockCycleCounter<span class="operator">::</span>compute_measure_time_lap ()
  {
          start ();
          spend_time ();

          <span class="type">long</span>                            nbr_tests <span class="operator">=</span> <span class="number">10</span>;
          <span class="keyword">for</span> (<span class="type">long</span> cnt <span class="operator">=</span> <span class="number">0</span>; cnt <span class="operator">&lt;</span> nbr_tests; <span class="operator">+</span><span class="operator">+</span>cnt)
          {
                  stop_lap ();
                  stop_lap ();
                  stop_lap ();
                  stop_lap ();
          }

          _measure_time_lap <span class="operator">=</span> _best_score;
  }

  <span class="type">void</span>    ClockCycleCounter<span class="operator">::</span>spend_time ()
  {
          <span class="keyword">const</span> Int64             nbr_clocks <span class="operator">=</span> <span class="number">500</span>;       <span class="comment">// Number of clock cycles to spend</span>

          <span class="keyword">const</span> Int64             start <span class="operator">=</span> read_clock_counter ();
          Int64                           current;

          <span class="keyword">do</span>
          {
                  current <span class="operator">=</span> read_clock_counter ();
          }
          <span class="keyword">while</span> ((current <span class="operator">-</span> start) <span class="operator">*</span> _clk_mul <span class="operator">&lt;</span> nbr_clocks);
  }

  Int64   ClockCycleCounter<span class="operator">::</span>_measure_time_total <span class="operator">=</span> <span class="number">0</span>;
  Int64   ClockCycleCounter<span class="operator">::</span>_measure_time_lap <span class="operator">=</span> <span class="number">0</span>;
  <span class="type">int</span>     ClockCycleCounter<span class="operator">::</span>_clk_mul <span class="operator">=</span> <span class="number">1</span>;
  bool    ClockCycleCounter<span class="operator">::</span>_init_flag <span class="operator">=</span> <span class="keyword">false</span>;

  }       <span class="comment">// namespace stopwatch</span>

  <span class="comment">/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span>

</pre>
</div>
<!-- @@@multimedia/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.cpp -->
        </div>
       </div>
   </div>
   </div>
</div>
<div class="footer">
   <p>
   <acronym title="Copyright">&copy;</acronym> 2019 The Qt Company Ltd.
   Documentation contributions included herein are the copyrights of
   their respective owners.<br/>    The documentation provided herein is licensed under the terms of the    <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation    License version 1.3</a> as published by the Free Software Foundation.<br/>    Qt and respective logos are trademarks of The Qt Company Ltd.     in Finland and/or other countries worldwide. All other trademarks are property
   of their respective owners. </p>
</div>
</body>
</html>