<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zeit in millisec; _plattformübergreifend_]]></title><description><![CDATA[<p>Hallo,</p>
<p>auch wenn das Thema nervt: Ich brauche eine Funktion, mit der ich die Zeit auf 1 Millisekunde genau messen kann. Ich hab mir dazu die Posts in den FAQs durchgelesen, aber festgestellt, dass die ganzen Lösungen plattform -, prozessor-, oder sonstwas abhängig sind (verbessert mich bitte, wenn ich mich irre). Ich brauche aber eine Funktion die sowohl auf einem Win98 Notebook als auch auf einem Kubuntu Desktopcomputer läuft. Ich sehe an SDL_GetTicks(), dass es soetwas geben muss, aber genau die Funktion darf ich (LGPL) nicht hernehmen.</p>
<p>Hoffe trotz des abgedroschenen Themas auf Antwort(en). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156138/zeit-in-millisec-_plattformübergreifend_</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 18:22:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156138.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Aug 2006 20:01:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 20:01:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>auch wenn das Thema nervt: Ich brauche eine Funktion, mit der ich die Zeit auf 1 Millisekunde genau messen kann. Ich hab mir dazu die Posts in den FAQs durchgelesen, aber festgestellt, dass die ganzen Lösungen plattform -, prozessor-, oder sonstwas abhängig sind (verbessert mich bitte, wenn ich mich irre). Ich brauche aber eine Funktion die sowohl auf einem Win98 Notebook als auch auf einem Kubuntu Desktopcomputer läuft. Ich sehe an SDL_GetTicks(), dass es soetwas geben muss, aber genau die Funktion darf ich (LGPL) nicht hernehmen.</p>
<p>Hoffe trotz des abgedroschenen Themas auf Antwort(en). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116663</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Sun, 13 Aug 2006 20:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 20:19:49 GMT]]></title><description><![CDATA[<p>kynarion schrieb:</p>
<blockquote>
<p>Ich sehe an SDL_GetTicks(), dass es soetwas geben muss,</p>
</blockquote>
<p>Ja, was glaubst Du wie die das hinbekommen haben? Indem sie die plattformabhängigen Lösungen je nach Plattform benutzen und eine Funktion anbieten, die für alle Plattformen gleich ist.</p>
<blockquote>
<p>aber genau die Funktion darf ich (LGPL) nicht hernehmen.</p>
</blockquote>
<p>Sagt nicht gerade das erste L, dass auch kommerzielle Projekte gegen die SDL linken dürfen, ohne den Sourcecode offenlegen zu müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116669</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sun, 13 Aug 2006 20:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 20:35:10 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>kynarion schrieb:</p>
<blockquote>
<p>Ich sehe an SDL_GetTicks(), dass es soetwas geben muss,</p>
</blockquote>
<p>Ja, was glaubst Du wie die das hinbekommen haben? Indem sie die plattformabhängigen Lösungen je nach Plattform benutzen und eine Funktion anbieten, die für alle Plattformen gleich ist.</p>
</blockquote>
<p>Hm. Keine einfachere Methode um an Millisekunden zu kommen? Achja: Ich kann windows.h nicht einbinden. Damit fällt wohl die Windowsvariante in den FAQs flach.</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>kynarion schrieb:</p>
<blockquote>
<p>Ich sehe an SDL_GetTicks(), dass es soetwas geben muss,</p>
</blockquote>
<p>Sagt nicht gerade das erste L, dass auch kommerzielle Projekte gegen die SDL linken dürfen, ohne den Sourcecode offenlegen zu müssen?</p>
</blockquote>
<p>Doch. Aber ich will die SDL <strong>nicht</strong> einbinden. Und ein Codeschnipsel aus der SDL rauszuziehen ist meineserachtens nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116675</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Sun, 13 Aug 2006 20:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 20:55:31 GMT]]></title><description><![CDATA[<p><a href="http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/" rel="nofollow">http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116681</guid><dc:creator><![CDATA[Weis0r]]></dc:creator><pubDate>Sun, 13 Aug 2006 20:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 21:00:11 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=10455" rel="nofollow">evilissimo</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=8" rel="nofollow">Rund um die Programmierung</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116684</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Sun, 13 Aug 2006 21:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Sun, 13 Aug 2006 22:01:10 GMT]]></title><description><![CDATA[<p>kynarion schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>kynarion schrieb:</p>
<blockquote>
<p>Ich sehe an SDL_GetTicks(), dass es soetwas geben muss,</p>
</blockquote>
<p>Sagt nicht gerade das erste L, dass auch kommerzielle Projekte gegen die SDL linken dürfen, ohne den Sourcecode offenlegen zu müssen?</p>
</blockquote>
<p>Doch. Aber ich will die SDL <strong>nicht</strong> einbinden. Und ein Codeschnipsel aus der SDL rauszuziehen ist meineserachtens nicht erlaubt.</p>
</blockquote>
<p>Einfach nachschauen welche Funktionen die SDL auf jeder Plattform verwendet ist sehr wohl erlaubt. Warum bitte kannst du windows.h nicht einbinden? o_0 Ohne WinAPI wirst du's unter Windows nicht zum Laufen bekommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Im Uebrigen ist es _NICHT MOEGLICH_ auf die Millisekunde genau zu messen, sowas kann kein normales Betriebssystem. Genauer als 10 oder vielleicht sogar 100 ms wirst du's nicht hinkriegen, da technisch mit Windows/Desktop-Linux nicht moeglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116697</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Sun, 13 Aug 2006 22:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 00:01:39 GMT]]></title><description><![CDATA[<p>100ms?! Jetzt übertreib mal nicht. Im normalen Betrieb ist es möglich sich in einer Sekunde fast jede vergangene Millisekunde in eine Datei schreiben zu lassen.<br />
Da hat man dann ein paar wenige übersprungene. Aber große Sprünge hat man im Normalbetrieb nicht.<br />
Klar wenn man gerade etwas recheninensives laufen hat ist das was anderes, aber ist ja auch nicht der normalfall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116723</guid><dc:creator><![CDATA[Lobby]]></dc:creator><pubDate>Mon, 14 Aug 2006 00:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 01:04:27 GMT]]></title><description><![CDATA[<p>Das Problem dabei ist, dass diese hohen Auflösungen unter Multitaskingbetriebssystemen nich garantiert werden kann.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116733</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 14 Aug 2006 01:04:27 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 06:55:42 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Einfach nachschauen welche Funktionen die SDL auf jeder Plattform verwendet ist sehr wohl erlaubt.</p>
</blockquote>
<p>Gut, dann spitzle ich da ein bisschen.</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Warum bitte kannst du windows.h nicht einbinden</p>
</blockquote>
<p>Weil ich sonst einen ganzen Haufen Compilerfehler krieg. Es sei denn, es gibt eine Möglichkeit, die GDI nicht miteinzubinden. Da muss ich noch mal nachschaun.</p>
<p>Swordfish schrieb:</p>
<blockquote>
<p>Das Problem dabei ist, dass diese hohen Auflösungen unter Multitaskingbetriebssystemen nich garantiert werden kann.</p>
</blockquote>
<p>Ich denke, wenn ich 99 - 100% der Prozessorzeit habe, schon. Und außerdem: GetTicks() geht nun mal leider richtig...</p>
<p>Unter Linux wär alles so einfach (gettimeofday). Warum muss Windows wieder zicken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116761</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Mon, 14 Aug 2006 06:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 07:48:59 GMT]]></title><description><![CDATA[<p>du kannst theoretisch auch die Socket API dafür nutzen. Hier gabs glaub ich auch irgendwo einen Eintrag in den FAQs</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116774</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 14 Aug 2006 07:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 10:12:26 GMT]]></title><description><![CDATA[<p>QueryPerformanceCounter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116816</guid><dc:creator><![CDATA[382732341X]]></dc:creator><pubDate>Mon, 14 Aug 2006 10:12:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 16:33:17 GMT]]></title><description><![CDATA[<p>Ok, also danke nochmal. Ich kopier den Code jetzt noch hier rein, einerseits damit ihr was zum bemängeln habt (bitte richtig auseinandernehmen, oder auch &quot;drüberwurschteln&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), andereseits damit ihn andere Timersuchende übernehmen können.</p>
<p>&quot;globale&quot; Headerdatei</p>
<pre><code class="language-cpp">#ifndef TIMER_HPP
#define TIMER_HPP

#include &lt;cstdlib&gt;

#ifdef __WIN32__ // Wir sind unter Windows? Dann Timerklasse in TimerWin benuetzen
#include &quot;TimerWin.hpp&quot;

#elif __unix__ || __linux__  //
#include &quot;TimerUnx&quot; // Gleiche Prozedur nur für Unix/Linux

#else
#include &quot;TimerStd&quot; // Anwender benutzt Extrawurscht-Betriebssystem, Timer mit der Funktion clock() aus time.h bauen.
//NOCH NICHT IMPLEMENTIERT!

#endif

#endif // TIMER_HPP
</code></pre>
<p>TimerWin.hpp</p>
<pre><code class="language-cpp">#ifndef TIMERWIN_HPP
#define TIMERWIN_HPP

#include &quot;Singleton.hpp&quot; //nur ein Timer benoetigt
#define NOGDI            // keine Grapfik, wer welche will, kann's weglassen
#include &lt;windows.h&gt;
#include &lt;mmsystem.h&gt;

#define gp_timer Timer::Get() //  aus Faulheit ^^

class Timer : public TSingleton&lt;Timer&gt;
{
	private:
			long long freq;  //Frequenz des Timers; benoetigt um die Sekunden zu errechnen
			long long cur, last;
			double resolution, elapsed; // max. Aufloesung des Timers und verstrichene Zeit in Sekunden
			bool QPCounter;

	public:
			Timer::Timer();
			void init();
			void update();
			double get_resolution(){return resolution;}
			inline double get_elapsed(){return elapsed;}
};

#endif // TIMER_HPP
</code></pre>
<p>TimerWin.cpp</p>
<pre><code class="language-cpp">#include &quot;TimerWin.hpp&quot;

Timer::Timer()
{
	last = cur = freq = 0;
	resolution = elapsed = 0.0;
	QPCounter = false;
}

void Timer::init()
{
	if(QueryPerformanceFrequency(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;freq))){ // Versuchen, den hochauflösenden Timer zu benuetzen
		QueryPerformanceCounter(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;last));
		resolution = 1.0 / freq;
		QPCounter = true;
	}

	else{  //Wenn nicht moeglich, den schlechteren, aber immer vorhandenen Timer benuetzen
		last = timeGetTime();
		resolution = 0.001;
	}
}

void Timer::update()
{
  if(QPCounter)
		QueryPerformanceCounter(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;cur));
	else
		cur = timeGetTime();
	elapsed = (cur - last) * resolution; //Zeitdifferenz berechnen und in Sekunden umwandeln
	last = cur;
}
</code></pre>
<p>TimerUnx.hpp</p>
<pre><code class="language-cpp">#ifndef TIMERUNX_HPP
#define TIMERUNX_HPP

#include &quot;Singleton.hpp&quot;

#define gp_timer Timer::Get()

class Timer : public TSingleton&lt;Timer&gt;
{
	private:
			 timeval *cur, *last;
       double resolution, elapsed;

	public:
			Timer::Timer();
			void Timer::init();
			void update();
			double get_resolution(){return resolution;}
			inline double get_elapsed(){return elapsed;}
};

#endif // TIMERUNX_HPP
</code></pre>
<p>TimerUnx.cpp</p>
<pre><code class="language-cpp">#include &quot;TimerUnx.hpp&quot;

Timer::Timer() : resolution(0.000001)
{
	elapsed = 0.0;
}

void Timer::init()
{
	gettimeofday(last, NULL);
}

void Timer::Update()
{
	gettimeofday(cur, NULL);
	elapsed = (cur.usec - last-&gt;usec) * resolution;
	last-&gt;usec = cur-&gt;usec;
}
</code></pre>
<p>Achtung: Der Linuxteil ist überhaupt nicht getestet.</p>
<p>Falls euch noch Teimer für ander Betriebssysteme kennt, bitte posten! Von einem Mac hab ich zum Beispiel nicht die geringste Ahnung, obwohl den auch recht viele hernehmen.</p>
<p>Also:<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Top<br />
oder<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> Flop?</p>
<p>(Ich bin Pessimist.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117118</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Mon, 14 Aug 2006 16:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 18:51:48 GMT]]></title><description><![CDATA[<p>gettimeofday ist überhaupt nicht zu empfehlen, da der Wert direkt von der Systemzeit abhängig ist und sie der Wert somit bei jeder Zeitänderung ebenfalls ändert.</p>
<p>Ich persönlich habe das timeGetTime() von Windows für Linux folgendermaßen erzeugt:</p>
<pre><code class="language-cpp">uint32 timeGetTime()
{
	timespec tp;
	::clock_gettime (CLOCK_MONOTONIC, &amp;tp);

	return tp.tv_sec * 1000 + tp.tv_nsec / 1000000;
}
</code></pre>
<p>Getestet unter Debian AMD64.</p>
<p>*edit*<br />
Die Definition von uint32 kann man sich denken, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117214</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Mon, 14 Aug 2006 18:51:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 18:59:23 GMT]]></title><description><![CDATA[<p>Würde unter Windows auf jeden Fall den QueryPerformanceCounter verwenden, ist sehr viel genauer als die ganzen anderen time-Funktionen der winapi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117217</guid><dc:creator><![CDATA[Lolz]]></dc:creator><pubDate>Mon, 14 Aug 2006 18:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Mon, 14 Aug 2006 19:17:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11548">@Neku</a><br />
Ok, werde das entsprechend ändern. Danke!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13970">@Lolz</a><br />
Hab ich evt. schon so gemacht?!?</p>
<blockquote>
<pre><code class="language-cpp">if(QueryPerformanceFrequency(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;freq))){ // Versuchen, den hochauflösenden Timer zu benuetzen
        QueryPerformanceCounter(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;last));
        resolution = 1.0 / freq;
        QPCounter = true;
    }
</code></pre>
</blockquote>
<p>Ansonsten weitere Anregungen erwünscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117230</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Mon, 14 Aug 2006 19:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Tue, 15 Aug 2006 22:11:55 GMT]]></title><description><![CDATA[<p>Wieso benutzt du _LARGE_INTEGER, und nicht LARGE_INTEGER?<br />
Und warum deklarierst du deine Member als long long, und nicht LARGE_INTEGER?</p>
<p>Ich würde zudem die Fallunterscheidung bei QPCounter vereinfachen. Problem dabei ist, dass du zwei unterschiedliche Aufrufe hast.</p>
<pre><code class="language-cpp">QueryPerformanceCounter(reinterpret_cast&lt;_LARGE_INTEGER*&gt;(&amp;cur));
// und
cur = timeGetTime();
</code></pre>
<p>Das passt natürlich nicht zusammen. Da timeGetTime sowieso die &quot;schlechtere&quot; Wahl ist, und idR auch nie aufgerufen wird, da so gut wie jeder aktuelle Rechner über Hardware Counter verfügt, werden wir diese Funktion QueryPerformanceCounter anpassen.</p>
<pre><code class="language-cpp">// private
static BOOL timeGetTimeAlias(LARGE_INTEGER* ticks)
{
    (*ticks).QuadPart = timeGetTime();
}
</code></pre>
<p>Als Member kommt nun ein entsprechender Funktionszeiger zum Einsatz</p>
<pre><code class="language-cpp">// private
BOOL (*GetTicks)(LARGE_INTEGER*);
</code></pre>
<p>welcher im ctor entweder mit QueryPerformanceCounter oder timeGetTimeAlias initialisiert wird, abhängig davon, ob Performance Counter verfügbar sind oder nicht.<br />
QPCounter entfällt damit, und Timer::update vereinfacht sich zu</p>
<pre><code class="language-cpp">GetTicks(reinterpret_cast&lt;LARGE_INTEGER*&gt;(&amp;cur));
    elapsed = (cur - last) * resolution; //Zeitdifferenz berechnen und in Sekunden umwandeln
    last = cur;
</code></pre>
<p>Zudem ist es einen Wimpernschlag schneller (bei vorhandenen Performance Countern). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1117908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117908</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 15 Aug 2006 22:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 06:14:15 GMT]]></title><description><![CDATA[<pre><code class="language-java">System.currentTimeMillis();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1117978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1117978</guid><dc:creator><![CDATA[In Java]]></dc:creator><pubDate>Wed, 16 Aug 2006 06:14:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 12:29:14 GMT]]></title><description><![CDATA[<p>*freu* Ich dachte schon, da kommt nichts mehr. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>groovemaster schrieb:</p>
<blockquote>
<p>Wieso benutzt du _LARGE_INTEGER, und nicht LARGE_INTEGER?</p>
</blockquote>
<p>Ähm ... hm ... gute Frage...</p>
<p>groovemaster schrieb:</p>
<blockquote>
<p>Und warum deklarierst du deine Member als long long, und nicht LARGE_INTEGER?</p>
</blockquote>
<p>Um ehrlich zu sein: weil's Arbeit spart.</p>
<p>groovemaster schrieb:</p>
<blockquote>
<p>Zudem ist es einen Wimpernschlag schneller (bei vorhandenen Performance Countern). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Schon wenns nur einen <em>Tick</em> schneller ist, freu ich mich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber leider taucht in der neuen Version ein Fehler auf:</p>
<pre><code class="language-cpp">class Timer : public TSingleton&lt;Timer&gt;
{
	private:
			long long freq; // Frequenz des Timers
			long long cur, last;
			double resolution, elapsed; // max. Auflösung des Timers und verstrichene Zeit in Sekunden
            BOOL (*GetTicks)(LARGE_INTEGER*);

			static BOOL timeGetTimeAlias(LARGE_INTEGER* ticks);

	public:
			Timer::Timer();
			void init();
			void update();
			double get_resolution(){return resolution;}
			inline double get_elapsed(){return elapsed;}
};
</code></pre>
<pre><code class="language-cpp">void Timer::init()
{
	if(QueryPerformanceFrequency(reinterpret_cast&lt;LARGE_INTEGER*&gt;(&amp;freq))){
		GetTicks = QueryPerformanceCounter;  //hier wird der Fehler angezeigt
		resolution = 1.0 / freq;
	}

	else{
		GetTicks = timeGetTimeAlias;
		resolution = 0.001;
	}
	GetTicks(reinterpret_cast&lt;LARGE_INTEGER*&gt;(&amp;last));
}

void Timer::update()
{
	GetTicks(reinterpret_cast&lt;LARGE_INTEGER*&gt;(&amp;cur));
	elapsed = (cur - last) * resolution; //Zeitdifferenz berechnen und in Sekunden umwandeln
	last = cur;
}

BOOL Timer::timeGetTimeAlias(LARGE_INTEGER* ticks)
{
	(*ticks).QuadPart = timeGetTime();
}
</code></pre>
<p>So sieht er aus:</p>
<pre><code>error: invalid conversion from 'BOOL (*)(_LARGE_INTEGER*)' to 'BOOL (*)(LARGE_INTEGER*)'
</code></pre>
<p>Witzigerweise zeigt er mir folgendes an, wenn ich alles in _LARGE_INTEGER ändere:</p>
<pre><code>error: invalid conversion from 'BOOL (*)(_LARGE_INTEGER*)' to 'BOOL (*)(_LARGE_INTEGER*)'
</code></pre>
<p>Logisch, gell?</p>
<p>@In Java: WAS? Ihr habt nur ne maximale Aulösung von einer Millisekunde? Gut, dass ich C++ gelernt hab... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>PS: Ich brauch dringend noch was für den Mac! Google sagt nicht viel dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118309</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Wed, 16 Aug 2006 12:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 16:54:37 GMT]]></title><description><![CDATA[<p>Winapi functionen verwenden __stcall und nicht __cdecl als Aufrufkonvention.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118575</guid><dc:creator><![CDATA[helper]]></dc:creator><pubDate>Wed, 16 Aug 2006 16:54:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 17:06:38 GMT]]></title><description><![CDATA[<blockquote>
<p>@In Java: WAS? Ihr habt nur ne maximale Aulösung von einer Millisekunde? Gut, dass ich C++ gelernt hab...</p>
</blockquote>
<p>Nö, wie kommst Du darauf? Aber es wurde nach der Zeit in Millisekunden gefragt.</p>
<p>Geht auch genauer:</p>
<pre><code class="language-java">System.nanoTime()
</code></pre>
<p>Aber jetzt erzählst Du mir wahrscheinlich gleich, dass eine Sprache, die Zeit nicht yokto-sekunden genau darstellen kann, für nix taugt. Keep on flaming... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118587</guid><dc:creator><![CDATA[In Java]]></dc:creator><pubDate>Wed, 16 Aug 2006 17:06:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 17:43:58 GMT]]></title><description><![CDATA[<p>helper schrieb:</p>
<blockquote>
<p>Winapi functionen verwenden __stcall und nicht __cdecl als Aufrufkonvention.</p>
</blockquote>
<p>d.h. ich schau in die Röhre? Auf die schnelle fällt mir nicht ein, was ich da machen soll. Den Zeiger dynamisch anlegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118622</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Wed, 16 Aug 2006 17:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 17:59:56 GMT]]></title><description><![CDATA[<p>Wie wär's, wenn Du einfach das if drinläßt? Wie oft in der Sekunde wirste Deinen Timer benutzen? Wieviele ticks werden Dir durch das if draufgehen? Ist das wirklich Dein Performance-Bottleneck?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118633</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 16 Aug 2006 17:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 18:03:28 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Wie wär's, wenn Du einfach das if drinläßt? Wie oft in der Sekunde wirste Deinen Timer benutzen?</p>
</blockquote>
<p>ca. 600 - 1000 mal. Oft genug, um zu optimieren, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118635</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Wed, 16 Aug 2006 18:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 18:33:05 GMT]]></title><description><![CDATA[<p>kynarion schrieb:</p>
<blockquote>
<p>Jester schrieb:</p>
<blockquote>
<p>Wie wär's, wenn Du einfach das if drinläßt? Wie oft in der Sekunde wirste Deinen Timer benutzen?</p>
</blockquote>
<p>ca. 600 - 1000 mal. Oft genug, um zu optimieren, oder?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> netter Joke.</p>
<p>Lohnt sich also noch kein Stück.<br />
Laß doch Dein Programm einfach mal laufen und benutze nen Profiler um rauszufinden, wieviel Prozent der Zeit Du im Timer verbringst.</p>
<p>Es gibt da sone wichtige Regel: die 80-20 Regel (oder war's 90-10?) 20% des Codes sind für 80% der Laufzeit verantwortlich. Gilt fast immer. Also finde erst raus welche 20% es bei Dir sind. Wenn Du außer dem timen noch irgendwas anderes machst (z.B. ein Dreieck rendern), dann wird sich der Großteil außerhalb des Timers abspielen.</p>
<p>edit: angenommen, Du sparst Dir 5 Takte pro Timerzugriff, das macht dann 5000 Takte pro Sekunde. Das sind, wenn wir mal mit 2,5Ghz rechnen also 5000/(2,5*10^9) s Zeitersparnis, also 2/10^6 s, macht also 2 millionstel Sekunden Zeitersparnis pro Sekunde. Das lohnt sich nicht. Woanders verbrätst Du sicher mehr Deiner Zeit.</p>
<p>edit2: Du kannst das Problem übrigens lösen, indem Du das QueryPerformanceCounter nochmal mit ner eigenen Funktion wrappst und dann auf die zeigst. Ich bezweifle aber ehrlich gesagt, daß das überhaupt schneller ist, als mit dem if zu trennen. Einer Epic-Games hat mal irgendwo nen Vortrag gehalten und meinte, sie würden gerne 10% Performance opfern, wenn sie dafür 10% schneller beim Entwickeln wären. Und die halten sich bestimmt nicht mit solchen Kleinigkeiten auf. Sollte sich das alles doch später nachdem Du alles fertig hast und nachgemessen hast als Problem herausstellen kannst Du die Implementation ja auch leicht ändern. Deswegen ist es imho momentan sinnvoller, Du konzentrierst Dich auf Dein eigentliches Ziel und läßt DIch nicht von solchen Kleinigkeiten ablenken. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118646</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 16 Aug 2006 18:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 18:36:40 GMT]]></title><description><![CDATA[<p>Profiler hab ich schon probiert, aber der bringt mir seltsamer Weiser bei jedem Testlauf (ohne Programmänderung natürlich) ein anderes Ergebnis. Vielleicht sollte ich das Programm entschieden länger laufen lassen.</p>
<p>Aber kann man die Lösung mit Funktionszeiger nicht irgendwie übernehmen?</p>
<p>[EDIT] Was fällt dir ein meine Fragen zu beantworten, bevor ich sie gestellt habe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> [/EDIT]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118659</guid><dc:creator><![CDATA[kynarion]]></dc:creator><pubDate>Wed, 16 Aug 2006 18:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zeit in millisec; _plattformübergreifend_ on Wed, 16 Aug 2006 18:39:42 GMT]]></title><description><![CDATA[<p>Doch, kannste übernehmen. Aber wie gesagt mußte den QueryPerformanceCounter nochmal mit ner eigenen Funktion wrappen und die in den Pointer stopfen.</p>
<p>Ja, sonen Profiler sollte man schon länger laufen lassen, damit er nen guten Durchschnitt kriegt. Allerdings sollte Dein Programm dazu nicht mehr ganz am Anfang stehen. Profiling macht erst dann Sinn, wenn Du bereits einen Teil der rechenaufwendigen Sachen implementiert hast. Wenn nur Kleinigkeiten gemacht werden, dann gehen die alle schnell und der langsamste wird sozusagen ausgelost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1118661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1118661</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 16 Aug 2006 18:39:42 GMT</pubDate></item></channel></rss>