<?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.9</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.9</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">Qt 5.9.4 Reference Documentation</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) // "'operator' : logical operation on address of string constant"</span> <span class="preprocessor">#pragma warning (1 : 4223) // "nonstandard extension used : non-lvalue array converted to pointer"</span> <span class="preprocessor">#pragma warning (1 : 4705) // "statement has no effect"</span> <span class="preprocessor">#pragma warning (1 : 4706) // "assignment within conditional expression"</span> <span class="preprocessor">#pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information"</span> <span class="preprocessor">#pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)"</span> <span class="preprocessor">#pragma warning (4 : 4355) // "'this' : used in base member initializer list"</span> <span class="preprocessor">#endif</span> <span class="comment">/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/</span> <span class="preprocessor">#include "ClockCycleCounter.h"</span> <span class="preprocessor">#include <cassert></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">></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"><</span>Int64<span class="operator">></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">></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"><</span>Int64<span class="operator">></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"><</span>Int64<span class="operator">></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"><</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"><</span><span class="type">double</span><span class="operator">></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"><</span><span class="type">double</span><span class="operator">></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"><</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"><</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"><</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">©</acronym> 2017 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>