Домашние класс Stopwatch


Вот некоторые из объяснений за точность и neg_accuracy:

Это означало, чтобы сохранить все значения в плане того, что пользователь указал, что он хотел (сколько десятичных разрядов глубоко они хотят пойти). точность призван сократить огромное количество возвращаемых GetTickCount() размер, и neg_accuracy фактически превращает его в десятичную путем деления.

Я просто надеялся получить некоторую критику на эффективность и уведомление о лучших способов сделать вещи.

//      -----------------------------------INSTRUCTIONS-----------------------------------
//      create a timer class object with with this function: ___Stopwatch PLACE_NAME_HERE( int NumberOfDecimals, string Command);___
//          Stopwatch PLACE_NAME_HERE( int NumberOfDecimals,
                                                            //put how many decimal integers deep you want tracked time to be (
                                                            // 1 decimal = 0.0,  inserting an integer with value 2 here = 0.00)
//                                  string Command);        // putting the command "Start" here makes it start timing right away

//    member functions include: Start() {starts the timer}
//                              Restart() {restarts the timer but doesn't clear saved Times}
//                              TimeElapsed() {returns the time elapsed since the Start() function was called}
//                              Wait( long float TIME_TO_WAIT) {doesn't return until time specified is over}
//                              SaveTime() {Saves the current time elapsed into a vector which can be accesed with:}
//                              GetTime( int TIME_TO_GET ) {returns the specified time; if you specify 1 you get the first time you saved
//                                                          otherwise the funciton returns 0 if there is no time saved at specified location}
//                              ClearTime() {Clears all saved times in the vector}

//      Call these functions by simply typing "STOPWATCH_NAME.A_FUNCTION();" and filling in the capitalized variables




// Windows stuff
#include <Windows.h> 
// STL stuff
#include <string>
#include <vector>
using namespace std;

    class Stopwatch
    {
    protected:
        int               accuracy, neg_accuracy;
        unsigned long int initial_ilu;
        unsigned long int current_ilu;
        long float        output_fl;
       vector<long float> times;

    public:

        Stopwatch(int DecNumb, string command  = "void") { // default command
                                    if (DecNumb>3) DecNumb = 3; 
                                    // I made here before DecNumb gets changed
                                    int I = 3 - DecNumb;
                                        // so accuracy*10 isn't 0
                                    for(accuracy = 1;I>0;I--)
                                    accuracy = accuracy*10;
                                    for(neg_accuracy = 1;DecNumb>0;DecNumb--) 
                                    neg_accuracy = neg_accuracy*10;
                                    if(command == "start" ||command == "Start") Start();}; 
        void Start(){initial_ilu = GetTickCount()/accuracy;};
        void Restart(){initial_ilu = GetTickCount()/accuracy;};
        long float ElapsedTime()
        {
            current_ilu = GetTickCount()/accuracy;
            output_fl =  ((long float)current_ilu - (long float)initial_ilu)/(long float)neg_accuracy;
            return output_fl;
        };
        void Wait(long float seconds) 
        {
            for(unsigned long int waitTime = GetTickCount() + (seconds*1000);
                waitTime > GetTickCount();) {}
            // stay stuck in for loop until time specified is up
        };

        void SaveTime(){times.push_back(ElapsedTime());};
        void ClearTime(){times.clear();times.resize(0);};  //  WILL THIS WORK? (untested)                                          
        long float GetTime(int location){int test = times.size();
            if(times.size() >= location) return times[location-1];
                                        };

    };


1117
7
задан 13 мая 2011 в 04:05 Источник Поделиться
Комментарии
2 ответа

Почему вы используете строки для команды класса? Они могут быть достаточно быстро для ваших нужд (так как ты только через клеща), но они, как правило, медленно, и если вы были, чтобы расширить класс, чтобы поддержать быстрее времени он может скинуть свои результаты. Рекомендуется использовать перечислимый или определить для команды класса:

В ваш заголовок, определите следующее:

enum{
STOPTIMER = 0,
STARTTIMER = 1
};

Затем измените ваш класс:

Stopwatch(..., int command = STOPTIMER) { 
...
if(command == STARTTIMER) Start();};

Я не большой поклонник некоторых из вашего стиля кодирования, но, по крайней мере, рассмотреть хранение его в соответствие. Если вы собираетесь ставить брекеты в конце линии в другом месте, сделайте это для объявления класса, а также. Рассмотрим отступы в коде, в петли, так что петлистой структуры очевидна.

Кроме того, обратите внимание, что GetTickCount() не очень точный - вы должны рассмотреть, чтобы быть уверенными, что ваш класс рекламирует только как точный это может быть, так как вы даете им возможность выбрать точностью. Они могут выбрать один, что класс действительно не могу поддержать. Не только это с точностью до миллисекунды (только 3 знака после запятой) это только обновляется 64 раза в секунду, так что это действительно только точный до 2 знаков после запятой. См http://en.wikipedia.org/wiki/GetTickCount для получения дополнительной информации. Есть и другие функции времени система, которая даст вам очень точные мс и нас время.

5
ответ дан 13 мая 2011 в 01:05 Источник Поделиться

Самый точный механизм газораспределения на окна QueryPerformanceCounter. Если вы используете вместе с QueryPerformanceCounterFrequency вы можете создать микросекунды точный таймер.

4
ответ дан 14 мая 2011 в 06:05 Источник Поделиться