Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Funktion optimieren

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456

    Funktion optimieren

    Hi Leute,

    kann mir mal jemand helfen, die folgende Funktion zu optimieren?

    Code:
    	__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
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    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...
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  4. #4
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    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,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Macht der Compiler das nicht eventuell schon selbst?
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    GCC auf jeden Fall schon. Natürlich nicht wenn man die Optimierungen abschaltet, aber das ist ja auch der Sinn der Sache

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •