Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion optimieren
Hi Leute,
kann mir mal jemand helfen, die folgende Funktion zu optimieren?
__uint64 fMSecClockGet(void)
{
struct timeval tv;
__int64 result;
gettimeofday(&tv,0);
result = 613656; // Anzahl Stunden zwischen dem 30.12.1899 und dem 1.1.1970
result *= 3600000; // Millisekunden pro Tag;
result += ((__int64) tv.tv_sec) * 1000 + (tv.tv_usec/1000); // Millisekunden seit dem 1.1.1970
CgClock = long(result * 10);
MSecClock = long(result);
return result;
}
Sie wird seeeeeeeehr häufig in unserer Software aufgerufen, ist im gesamten Programm nach der Hauptschleife die lastintensivste Funktion...
Ich muss die CPU Last des Programms runter kriegen, und der Profiler sagt, dies sei die Funktion mit der größten CPU Last.
edit: Ich vermute, die hohe Last kommt durch das wiederholte Aufrufen von gettimeofday zustande. Gibt's da Alternativen, die nicht so CPU lastig sind?
Danke!
Grüße,
Hendrik
Hi,
wenn es darum geht, eine CPU Last zu senken (soll wirklich die CPU Last geseknt werden, oder die Laufzeit des Programm optimiert werden?), so ist es oft mit verändern einzelner Systemaufrufe nicht getan.
Du solltest dir eher die Frage stellen, warum die Funktion soooooo oft aufgerufen wird. Ist das wirklich notwendig? Macht das Programm "Busy Waits" bis bestimmte Zeitintervalle verstrichen sind? Kann man da nicht auch einen Timer einsetzen?
Die Software sollte so oft wie möglich die Kontrolle an das System zurückgeben. Dies geschieht durch blockende Systemaufrufe. Wenn die Software dies nicht tut, wird sie immer 99% Systemauslastung erzeugen.
Gruß
almoeli
Es geht um die Reduzierung der CPU Last, ohne daß Performance der Software verloren geht.
Wir simulieren damit Teilnehmer; seien es normale POTS (Plain Old Telephone Service) Teilnehmer, Tln. in IP Telefonie oder anderes... Und je mehr Leistung unsere Software dahingehend bringt, umso besser... allerdings - und das ist der springende Punkt hier - macht die Software zur Zeit sogar bei ca. 5000 Tln. 80 - 90% CPU Last auf B-Seite (angerufener Teilnehmer)!!! Die A-Seite (anrufender Teilnehmer) macht eigenartigerweise weniger CPU Last...
Ich hab da mal den Profiler drüber laufen lassen (gprof), und der hat mir oben genannte Funktion als diejenige ausgespuckt, die prozentual nach der Hauptschleife am meisten CPU Zeit verbrät...
Wir benutzen (selbstentwickelte) Timer. Und diese Funktion ist unter anderem dafür da, den Timern die notwendige Zeit mitzugeben. Für vieles innerhalb unserer Software benötigen wir die Systemzeit in Mikrosekunden. Daher ist diese Funktion leider nicht verzichtbar. Und aus dem Grund wäre es super, wenn's da noch Optimierungspotenzial gäbe...
Moin moin,
ich bin nicht gerade der C/C++ Spezi, aber ich würde damit Anfangen, Konstanten zusammezufassen, also statt
result = 613656; // Anzahl Stunden zwischen dem 30.12.1899 und dem 1.1.1970
result *= 3600000; // Millisekunden pro Tag;
lieber gleich
result = 2209161600000;
so sparst Du Dir schon mal eine Multiplikation pro Aufruf...
MfG,
Macht der Compiler das nicht eventuell schon selbst?
peschmae
19-12-2006, 16:16
GCC auf jeden Fall schon. Natürlich nicht wenn man die Optimierungen abschaltet, aber das ist ja auch der Sinn der Sache ;)
MfG Peschmä
quinte17
24-12-2006, 09:35
durch implicit typecasts wird doch oftmals auch noch was verbraten.
also cast zwischen int32 und int64.
(__int64) result = (int) konstante?;
nochdazu sind da ja dann beide signed, was noch mehr überprüfungen mit sich bringen könnte.
greetz
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.