C++を得るミリ秒単位の時間Linux—時計()があるようには見えませんと正常に動作

StackOverflow https://stackoverflow.com/questions/588307

  •  09-09-2019
  •  | 
  •  

質問

Windows clock() を返します時間をミリ秒ですが、このLinux箱のように、巡回で最寄りの1000の精度は"第二の"レベルのいないので、ミリ秒レベル。

このソリューションのQtを使用 QTime クラスは、スをインスタンス化するオブジェクトは、呼び出し start() もし呼び出し elapsed() の数ミリ秒単位の時間が経過するまで

私のような幸運をしてほしいをしてほしいとQtにしてしまいましたが、まず私が解決策に依存しない第三者の図書館

はありませんの標準的な方法なのか。

更新

ないでくださいお勧めしあげ..

場合にブーストQtで確実なプロジェクトでは、選ばれている標準でない使用しています!●

役に立ちましたか?

解決

きgettimeofdayの開始と終了の方法、その差を返し構造体.多くの構造は次のように:

struct timeval {
  time_t tv_sec;
  suseconds_t tv_usec;
}

他のヒント

#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    struct timeval start, end;

    long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);
    usleep(2000);
    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

    printf("Elapsed time: %ld milliseconds\n", mtime);

    return 0;
}

clockない 測定掛時計。この場合プログラムか5秒 clock な措置を5秒間ものができます(プログラムが複数のスレッドなどが消費する以上のCPUより実時間)以内とする。での対策で近似し、近似した CPU時間 使用します。の違いのコードを参照してください

#include <iostream>
#include <ctime>
#include <unistd.h>

int main() {
    std::clock_t a = std::clock();
    sleep(5); // sleep 5s
    std::clock_t b = std::clock();

    std::cout << "difference: " << (b - a) << std::endl;
    return 0;
}

出力し自分のシステム

$ difference: 0

なにかったた寝を使用せず、他のCPU時間!しかし、利用 gettimeofday ました(?)

#include <iostream>
#include <ctime>
#include <unistd.h>
#include <sys/time.h>

int main() {
    timeval a;
    timeval b;

    gettimeofday(&a, 0);
    sleep(5); // sleep 5s
    gettimeofday(&b, 0);

    std::cout << "difference: " << (b.tv_sec - a.tv_sec) << std::endl;
    return 0;
}

出力の私のシステム

$ difference: 5

が必要な場合はより精度で取得したい CPU時間, きますので、その利用を考える getrusage 機能です。

すのもおすすめのツールを提供するもの。のいずれかに記ブタイマーは、hackるものがある。DateTimeが新たに提案された図書館のサンドボックス- が進みました。クロノ:この最後の一つまでのタイマー、特徴:

  • C++0x標準ライブラリの時間を費を含む
    • クラステンプレート duration
    • クラステンプレート time_point
    • 時計:
      • system_clock
      • monotonic_clock
      • high_resolution_clock
  • クラステンプレート timer, は、typedefs:
    • system_timer
    • monotonic_timer
    • high_resolution_timer
  • 工程フロントエン:
    • process_clock, 撮影後、実際、ユーザー-CPUシステムのCPUます。
    • process_timer, 撮影後、経過、ユーザー-CPUシステムのCPUます。
    • run_timer, 便利な報告|process_timer|。
  • C++0x標準ライブラリのコンパイル時の合理的な算数.

こちらのソース の機能一覧

長々と書きましたが、 Timer クラスに基づく CTTの回答.使用でき次のようになっています:

Timer timer = Timer();
timer.start();
/* perform task */
double duration = timer.stop();
timer.printTime(duration);

こちらはその実施:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
using namespace std;

class Timer {
private:

    timeval startTime;

public:

    void start(){
        gettimeofday(&startTime, NULL);
    }

    double stop(){
        timeval endTime;
        long seconds, useconds;
        double duration;

        gettimeofday(&endTime, NULL);

        seconds  = endTime.tv_sec  - startTime.tv_sec;
        useconds = endTime.tv_usec - startTime.tv_usec;

        duration = seconds + useconds/1000000.0;

        return duration;
    }

    static void printTime(double duration){
        printf("%5.6f seconds\n", duration);
    }
};

必要がない場合には、コードの可搬性にunicesを使用できclock_gettime()例えば図で示されているのに時間 ナノ秒 使用した場合は、プロセッサ対応する解像度)。このPOSIXから2001年.

時計()はたくさんしゃ。たい場合には測定時間をミリ秒単位のレベルは、インタビューを受けたことがある利用clock_gettime()、 説明しています。

することに注意してください)必要なリンク-lrtにLinuxで共通)。

C++11 std::chrono::high_resolution_clock を実行します。

#include <iostream>
#include <chrono>
#include <thread>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    std::chrono::milliseconds three_milliseconds{3};

    auto t1 = Clock::now();
    std::this_thread::sleep_for(three_milliseconds);
    auto t2 = Clock::now();

    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
              << " milliseconds" << std::endl;
}

出力:

Delta t2-t1: 3 milliseconds

リンクのデモ: http://cpp.sh/2zdtu

時計()とならないミリ秒単位は秒でプログラムを利用しています。.通常はクロック()マイクロ秒単位で返します。の適切な解釈によって返された値に時計()は分割でCLOCKS_PER_SECにどのくらい時間が経過しました。

この試作---macで...

#include <stdio.h>
#include <sys/time.h>

int main() {
        struct timeval tv;
        struct timezone tz;
        struct tm *tm;
        gettimeofday(&tv,&tz);
        tm=localtime(&tv.tv_sec);
        printf("StartTime: %d:%02d:%02d %d \n", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
}

ね...ですが、手を差し引...

はPOSIX準 clock その戻り値に基づいて定義されるためCLOCKS_PER_SEC記号実装は、無料の定義この他に便利です。Linuxでいたのは幸運に times() 機能です。

gettimeofdayの問題は、すでに低値を変更した場合でハードクロック(NTP) ブースト不可このプロジェクト 時計()-通常を返します4バイト整数、既にこのような低容量、およびその後の時間を返しますnegativeます。

かを自分のクラスおよび更新10miliseconds、この方法はより柔軟なかでも改善しています。

class MyAlarm {
static int64_t tiempo;
static bool running;
public:
static int64_t getTime() {return tiempo;};
static void callback( int sig){
    if(running){
        tiempo+=10L;
    }
}
static void run(){ running = true;}
};

int64_t MyAlarm::tiempo = 0L;
bool MyAlarm::running = false;

リフレッシュで使っていsetitimer:

int main(){
struct sigaction sa; 
struct itimerval timer; 

MyAlarm::run();
memset (&sa, 0, sizeof (sa)); 
sa.sa_handler = &MyAlarm::callback; 

sigaction (SIGALRM, &sa, NULL); 


timer.it_value.tv_sec = 0; 
timer.it_value.tv_usec = 10000; 



timer.it_interval.tv_sec = 0; 
timer.it_interval.tv_usec = 10000; 


setitimer (ITIMER_REAL, &timer, NULL); 
.....

見setitimerのITIMER_VIRTUALとITIMER_REAL.

なしアラームまたはualarm機能に関しておくことが望ましい精度がプロセスを取得します。

やってました ブタイマー図書館 分かりやすさは、そのままにしたくない第三parrty図書館、時計というリーズナブル。

としてアップデートがwindowsのクロック(策ウォール時計時間(CLOCKS_PER_SEC精度)

 http://msdn.microsoft.com/en-us/library/4e2ess30(VS.71).aspx

をLinuxに対応できるcpu時間全体のコアを使用する現在のプロセス

http://www.manpagez.com/man/3/clock

(でが表示され、指摘されているように、独自のポスター発表と実際 精度のよCLOCKS_PER_SECものかによって異なる、特定版プログラムを利用しています。.

私のようにのぞかし大豆を使わない方法gettimeofday().始めたときはパニックだった走行中のサーバの管理者の変更のタイムゾーン.時計の針を更新しましたのと同じ(訂正)地方の値です。この機能time()とgettimeofday()へのシフト時間は2時間、すべてのタイムスタンプの一部のサービスも滞っております。

書いた C++ クラスを使用 timeb.

#include <sys/timeb.h>
class msTimer 
{
public:
    msTimer();
    void restart();
    float elapsedMs();
private:
    timeb t_start;
};

会員機能

msTimer::msTimer() 
{ 
    restart(); 
}

void msTimer::restart() 
{ 
    ftime(&t_start); 
}

float msTimer::elapsedMs() 
{
    timeb t_now;
    ftime(&t_now);
    return (float)(t_now.time - t_start.time) * 1000.0f +
           (float)(t_now.millitm - t_start.millitm);
}

使用例:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
    msTimer t;
    for (int i = 0; i < 5000000; i++)
        ;
    std::cout << t.elapsedMs() << endl;
    return 0;
}

出力マイコンピュータは19'.精度の msTimer クラスは、ミリ秒です。の使用例は、上記の合計時間の実行に使われていますが、私たちはア forループを追跡.この時期の営業システムスイッチングの実行コンテキストの main() による複合加工.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top