Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Unterschiedliches Verhalten bei 64bit integers ....

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.07.2005, 13:05 Uhr
RHBaum



Wir verwenden zum zeitmessen 64 Bit zeitstempel. Zum korrelieren brauchen wir den Systemcounter auf nanosekunden Basis ...

Hier nen Schnell zusammengeschustertes Testprogramm ....
(Konsole)


C++:
// QueryPerfCheck.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>

static inline ULONGLONG getSysTicks()
{
    LARGE_INTEGER lbuff;
    lbuff.QuadPart = 0;
    ::QueryPerformanceCounter(&lbuff);
    return lbuff.QuadPart;
}
static inline ULONGLONG getSysFreq()
{
    LARGE_INTEGER lbuff;
    lbuff.QuadPart = 0;
    ::QueryPerformanceFrequency(&lbuff);
    return lbuff.QuadPart;
}
inline static double Get_TimeResolution_usec()
{
    LARGE_INTEGER lr;
    ::QueryPerformanceFrequency(&lr);
    return static_cast<double>(lr.QuadPart / 1000000.0);
}
static inline ULONGLONG Ticks2NS(ULONGLONG aTicks)
{
    static ULONGLONG NSperTick = static_cast<ULONGLONG>(1000000000) / getSysFreq();
    return aTicks * NSperTick;
}

int main(int argc, char* argv[])
{
    ULONGLONG lStart = getSysTicks();

    for(int i = 0; i < 10; ++i)
    {
        ULONGLONG qperyValue = getSysTicks();
        ULONGLONG qfreqValue = getSysFreq();
        ULONGLONG nsAll = Ticks2NS(qperyValue);
        ULONGLONG nsakt = Ticks2NS(qperyValue-lStart);
        ULONGLONG ms = nsakt / 1000000;

        char buffer[1024];
        _snprintf(buffer,1024,"QueryPerfomranceCounter : %20.20I64u\nQueryPerfomranceFrequency : %20.20I64u\nNanosec gesamt :  %20.20I64u\nNanosec seit Start : %20.20I64u\n ms seit Start : %1.1I64u\n \n",qperyValue,qfreqValue,nsAll, nsakt,ms );
        std::cout << buffer;
        ::Sleep (1000);
    }
    return 0;
}




das static steht vor den Funktionen, weil die eigentlich im richtigen programm Methoden (static) von ner klasse sind ... hab die nur kopiert ....

Funktioniert bei meinem PC ohne Probs ... ich krieg einigermassen plausieble Zeitstempel ....
(WinXP, MSVS Version 6.0 .... Pentium 4 1000 )

Auf einigen anderen rechnern hab ich folgendes Sympthom :
QueryPerformanceCounter - Wert ok
QueryPerformanceFrequency - Wert ok

Alle anderen Werte auf 0 !

Also sobald ich Ticks2NS benutze, wird alles 0 ....

Rechne ich in doubles um und multiplizier / dividier mit doubles , funktioniert es, ist aber ungenauer ....

Warum koennen die einen rechner mit 64 bit multiplication umgehen, die anderen nicht ...

Betriebssystem ist ueberall WIndows XP
nich auf allen wo es funktioniert ist MSVS 6.0 drauf
Auf denen wo es nicht funktioniert ist aber auch kein MSVS drauf ....

Prozessoren sind alles Pentiums (PIII - PIV)

Woran kann das liegen ???
Oder seh ich nen Schnitzer der zu undef. Verhalten fuehrt, einfach nicht ?
Getestet auf allen rechnern mit der release Version, so dass alle die theorethisch selbe CRT anziehen ...
die dbg version funktioniert auf den rechnern mit installiertertem VC 6.0 genau wie die release version ...

muss ich 64 bit rechenoperationen nu selber implementieren, denk das sollte der MS compiler koennen (das release testprogramme wurde auf nur einem (meinem) Comp compiliert) :-(

Ciao ....

Dieser Post wurde am 29.07.2005 um 13:15 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2005, 17:15 Uhr
deKeep



hi!

ULONGLONG? von dem typen hab ich ja noch nie gehört, hast du den selbst geschrieben?
oder funktioniert er so wie ULARGE_INTEGER?

in dem fall hättest du aber einen derben schnitzer eingebaut, weil es dann nicht:
"ULONGLONG qperyValue = getSysTicks();"

sondern:

"ULONGLONG qperyValue.QuadPart = getSysTicks();"

heissen müsste! und wenn er das nicht schluckt, dann halt ohner wert erzeugen und danach zuweisen.



was mir noch aufgefallen ist, kann aber sein, dass der fall nie eintreten kann...

"static ULONGLONG NSperTick = static_cast<ULONGLONG>(1000000000) / getSysFreq();"

wenn getSysFreq() genau 0 zurück gibt - warum auch immer - dann schmiert das programm ab!

vielleicht konnte ich dir ja helfen...

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.08.2005, 09:17 Uhr
RHBaum




Zitat:

ULONGLONG? von dem typen hab ich ja noch nie gehört, hast du den selbst geschrieben?


Neee is nen typedef auf unsigned __int64 .... gemacht irgendwo in den tiefen der windows.h .
Also ein von MS offiziell supporteter datentyp ... steht auch in der MSDN als Datentyp drin ...


Zitat von Verfasser:

wenn getSysFreq() genau 0 zurück gibt - warum auch immer - dann schmiert das programm ab!


waer mir lieber, weil dann weiss ich wenigstens woran es liegt

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.08.2005, 14:46 Uhr
deKeep



hmm...

dann könntest du vielleicht auch mit ULARGE_INTEGER arbeiten? damit kenn ich mich aus! wichtig bei allen zuweisungen ist da, das ".QuadPart" nie zu vergessen, sonst macht das programm nie was man will...

p.s.: ok, ich hab gerade gesehen, dass .QuadPart eine Membervariable im Format ULONGLONG ist... also nehm ich alles zurück!

deKeep

Dieser Post wurde am 01.08.2005 um 14:57 Uhr von deKeep editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.08.2005, 17:32 Uhr
Oliver
S2-Pixelgeneral


Guck dir am besten mal das Disassembly an guck mal, wann es da und warum 0 wird, evtl. wirst du da schlauer.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.08.2005, 11:16 Uhr
RHBaum



@Oliver

wie gesagt, bei mir siehts ok aus ... macht genau das was man will .... wird also nie 0 ....

die binaries sind ja gleich, weil ich benutze das, was bei mir compiliert wurde, und funktioniert, auch auf den anderen maschinen . Da funzt es dann komischer weisse nicht.

Auf den anderen maschinen kann ich leider keine entwicklungsumgebung installieren (kriege da keine admin rechte) .... so dass ich da nicht debuggen kann ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2005, 11:45 Uhr
deKeep



Ach das kommt mir dann schon eher bekannt vor!

Ich weiss ja nicht genau, was Dein Programm so alle kann und macht, aber könnte es ein Rechteproblem sein, dass Dein Programm auf gewisse Rechte, z.B. Datei lesen/schreiben, angewiesen ist, sie aber nicht hat?

Ist es möglich, dass Du an manchen Stellen Nullwerte bekommst, weil etwas fehlschlug, Du aber sinnvolle Werte erwartest? Läuft Deine Debugversion auch bei Dir als Release richtig?

Am besten schreibst Du Dir mal ein paar Debugausgaben, die Du in eine Datei schreibst, dann siehst Du überall, wo wo im Programm passiert!

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.08.2005, 09:37 Uhr
RHBaum



neee, schau dir das obige programm an, das ist genau das, was schon das unterschiedliche verhalten ausprinted
also den code da zu ner exe compiliert ... mit dem MSVC 6.0 SP6 und die exe auf unterschiedlichen rechnern laufen lassen, printed unterschiedliche werte aus !

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: