Ja das war mir klar ;-). Jetzt sehe ich aber gerade, das die erst ab WinVista unterstützt wird. Ich bin hier mit XP unterwegs... mal sehen!
_________________ Ich habe aus dieser sogenannten höchsten Erleuchtung nichts gewonnen, und genau aus diesem Grund heißt sie auch höchste Erleuchtung - Gautama Buddha
_________________ Ich habe aus dieser sogenannten höchsten Erleuchtung nichts gewonnen, und genau aus diesem Grund heißt sie auch höchste Erleuchtung - Gautama Buddha
#include <time.h>
#include <windows.h>
namespace _stde{
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
typedef struct _cpu_ticks_struct // Struct Contains informations about the Cpu ticks to calculate RunTime
{
double dLastTime; //Last Time wich has been setted
LARGE_INTEGER liLastCount; //Last Count number which has been setted double dCheckTime; //Time which has been checked double dReturn; //Return value
LARGE_INTEGER nFreq; //Frequency
LARGE_INTEGER nCount; //Tick Count double GetCPUTicks(void); //Procedure to Calulate the Framerate double GetMilliseconds(void);
_cpu_ticks_struct(); //Ctor
~_cpu_ticks_struct(); //Dtor
}CPUTICKSSTRUCT,*LPCPUTICKSSTRUCT; //Struct Contains informations about the Cpu ticks to calculate RunTime typedef CPUTICKSSTRUCT CTS; //Make it a bit shorter typedef LPCPUTICKSSTRUCT LPCTS; //Make it a bit shorter
}
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
// check for a new frequency once every 5 seconds
// note: this is in case ACPI, etc. alters it if((this->nFreq.QuadPart == 0) || (this->dCheckTime < (this->dReturn)))
{
this->dCheckTime = this->dReturn + 5.0;
// avoid a division by zero by returning zero on error if(!QueryPerformanceFrequency(&(this->nFreq))) return 0.0;
}
// use the ratio of tick amount divided by frequency to find the hertz
QueryPerformanceCounter(&(this->nCount));
if(this->liLastCount.QuadPart!=0){
counter.QuadPart=this->nCount.QuadPart-this->liLastCount.QuadPart;
this->dReturn = ((double)counter.QuadPart / (double)this->nFreq.QuadPart);
};
this->liLastCount=this->nCount;
if(this->dReturn!=0){this->dReturn=double(1)/(this->dReturn);};
return (this->dReturn);
};
#include <time.h>
#include <windows.h>
namespace _stde{
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
typedef struct _cpu_ticks_struct // Struct Contains informations about the Cpu ticks to calculate RunTime
{
double dLastTime; //Last Time wich has been setted
LARGE_INTEGER liLastCount; //Last Count number which has been setted double dCheckTime; //Time which has been checked double dReturn; //Return value
LARGE_INTEGER nFreq; //Frequency
LARGE_INTEGER nCount; //Tick Count double GetCPUTicks(void); //Procedure to Calulate the Framerate double GetMilliseconds(void);
_cpu_ticks_struct(); //Ctor
~_cpu_ticks_struct(); //Dtor
}CPUTICKSSTRUCT,*LPCPUTICKSSTRUCT; //Struct Contains informations about the Cpu ticks to calculate RunTime typedef CPUTICKSSTRUCT CTS; //Make it a bit shorter typedef LPCPUTICKSSTRUCT LPCTS; //Make it a bit shorter
}
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
// check for a new frequency once every 5 seconds
// note: this is in case ACPI, etc. alters it if((this->nFreq.QuadPart == 0) || (this->dCheckTime < (this->dReturn)))
{
this->dCheckTime = this->dReturn + 5.0;
// avoid a division by zero by returning zero on error if(!QueryPerformanceFrequency(&(this->nFreq))) return 0.0;
}
// use the ratio of tick amount divided by frequency to find the hertz
QueryPerformanceCounter(&(this->nCount));
if(this->liLastCount.QuadPart!=0){
counter.QuadPart=this->nCount.QuadPart-this->liLastCount.QuadPart;
this->dReturn = ((double)counter.QuadPart / (double)this->nFreq.QuadPart);
};
this->liLastCount=this->nCount;
if(this->dReturn!=0){this->dReturn=double(1)/(this->dReturn);};
return (this->dReturn);
};
#include <time.h>
#include <windows.h>
namespace _stde{
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
typedef struct _cpu_ticks_struct // Struct Contains informations about the Cpu ticks to calculate RunTime
{
double dLastTime; //Last Time wich has been setted
LARGE_INTEGER liLastCount; //Last Count number which has been setted double dCheckTime; //Time which has been checked double dReturn; //Return value
LARGE_INTEGER nFreq; //Frequency
LARGE_INTEGER nCount; //Tick Count double GetCPUTicks(void); //Procedure to Calulate the Framerate double GetMilliseconds(void);
_cpu_ticks_struct(); //Ctor
~_cpu_ticks_struct(); //Dtor
}CPUTICKSSTRUCT,*LPCPUTICKSSTRUCT; //Struct Contains informations about the Cpu ticks to calculate RunTime typedef CPUTICKSSTRUCT CTS; //Make it a bit shorter typedef LPCPUTICKSSTRUCT LPCTS; //Make it a bit shorter
}
//##################################################################################################
//
// CPUTICKSSTRUCT
// Struct Contains informations about the Cpu ticks to calculate RunTime
//
//##################################################################################################
// check for a new frequency once every 5 seconds
// note: this is in case ACPI, etc. alters it if((this->nFreq.QuadPart == 0) || (this->dCheckTime < (this->dReturn)))
{
this->dCheckTime = this->dReturn + 5.0;
// avoid a division by zero by returning zero on error if(!QueryPerformanceFrequency(&(this->nFreq))) return 0.0;
}
// use the ratio of tick amount divided by frequency to find the hertz
QueryPerformanceCounter(&(this->nCount));
if(this->liLastCount.QuadPart!=0){
counter.QuadPart=this->nCount.QuadPart-this->liLastCount.QuadPart;
this->dReturn = ((double)counter.QuadPart / (double)this->nFreq.QuadPart);
};
this->liLastCount=this->nCount;
if(this->dReturn!=0){this->dReturn=double(1)/(this->dReturn);};
return (this->dReturn);
};
Bedenke das die Erzeugung eines Threads weitaus länger dauert (zwischen 0,5 ms bis 2,5ms, vom Aufruf CreateThread bis zum fertigen Eintritt in die THREAD_PROC) als der Kontextwechsel,...
grüße
_________________ Der Contrapart in einer Diskussion zu sein, heißt nicht das dieser Standpunkt
der eigene sein muss!
Bedenke das die Erzeugung eines Threads weitaus länger dauert (zwischen 0,5 ms bis 2,5ms, vom Aufruf CreateThread bis zum fertigen Eintritt in die THREAD_PROC) als der Kontextwechsel,...
Ich zweifle GANZ STARK daran, dass die 0.5 - 2.5 ms der Wirklichkeit entsprechen.
(Dass es länger als der Kontextwechsel dauert, damit wirst du allerdings vermutlich Recht haben - würde mich zumindest stark wundern wenn nicht)
Haben wir auf zwei systemen getestet:
Aus Thread A mit Prio -15 bis 15 wird ein Thread B gestartet mit Prio -15 bis 15
Gezählt wurde die Zeit (Per QueryPerformanceCounter)
von VOR
CreateThread
Bis Nach
WaitForSingleEvent()
Der Event wurde nach Eintritt in die Threadfunk gesetzt.
Ein paar tausend Durchläufe bei Nominallast des Systems,
Die Zeit aufgetragen als DensityPlot über ThreadPrio A u B
Getestet wurden:
Core2Duo P8400 @ 2.26 Ghz 2.27 Ghz 2GBRam Max: 2250µs Min: >460µs
(ok es gab noch eine klitzekleine spitze bei Prio -15,5 bei rund 3593µs)
AMD Athlon XP 2200+ 1.80 Ghz 1.5 GBRam Max: >4040µs Min: >907µs
_________________ Der Contrapart in einer Diskussion zu sein, heißt nicht das dieser Standpunkt
der eigene sein muss!
@zeusosc:
Kann ich nicht ganz nachvollziehen.
Ich hab jetzt keinen so ausführlichen Test mit min/max/avg gemacht und auch nur mit Priorität 0, aber da komme ich auf 110 ~ 140ms für 1000 Threads, also so 0.11 ~ 0.14ms pro Thread.
Also etwa Faktor 4 - 20 schneller als deine Zahlen.
Ganz einfacher Test, ein Thread startet immer den nächsten, der letzte setzt den Event:
Das misst jetzt natürlich was anderes als dein Test.
Dein Test misst ja die Zeit die zum Erstellen und "Loslaufen" des neuen Threads benötigt wird + die Zeit die vom SetEvent() bis zum Aufwachen des startenden Threads vergeht.
Meiner misst nur die Zeit die zum Erstellen und "Loslaufen" des neuen Threads benötigt wird, weil der ja gleich wieder den nächsten startet, und nur zum Schluss 1x der "Eltern-Thread" aufgeweckt wird.
ps: solche Tests muss man frei laufen lassen. Wenn ich die Release Version unter Visual Studio laufen lasse, ist die mehr als Faktor 10 langsamer! Sollte klar sein, ich sag's nur vorsichtshalber trotzdem dazu.
Zeit liegt immer noch bei ~~ 0.13 ms pro Thread.
Selbst wenn ich nicht nur auf den Event, sondern auf das Thread-Object selbst warte, ändert sich nichts an der gemessenen Zeit:
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.