10

私は本質的に getTickCount() ウィンドウ関数を再構築したいので、非標準ライブラリやSTLさえも使わずに基本的なC++で使用できます。(したがって、Android NDK で提供されるライブラリに準拠しています)

私は見てきた

時計()

現地時間

時間

しかし、時間ライブラリを使用して getTickCount ウィンドウ関数を複製できるかどうかはまだわかりません。

これを行う方法、または可能である場合でも、誰かが私を正しい方向に向けることができますか?

私がやりたいことの概要:

アプリケーションが特定の機能を「実行」している時間を計算できるようにしたいと考えています。

たとえば、アプリケーションがサーバーに登録しようとしている時間を計算できるようにしたい

LinuxベースのAndroidで実行するためにWindowsから移植しようとしています.Windowsコードは次のとおりです。


int TimeoutTimer::GetSpentTime() const
{
if (m_On)
{
    if (m_Freq>1)
    {
        unsigned int now;
        QueryPerformanceCounter((int*)&now);
        return (int)((1000*(now-m_Start))/m_Freq);
    }
    else
    {
        return (GetTickCount()-(int)m_Start);
    }
}
return -1;
}
4

5 に答える 5

21

Android NDK では、libc の一部である POSIX clock_gettime() 呼び出しを使用できます。この関数は、さまざまな Android タイマー呼び出しが終了する場所です。

たとえば、java.lang.System.nanoTime() は次のように実装されています。

struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return (u8)now.tv_sec*1000000000LL + now.tv_nsec;

この例では、期間を計算するときに必要なモノトニック クロックを使用します。壁掛け時計 (gettimeofday() で利用可能) とは異なり、デバイスの時計がネットワーク プロバイダーによって変更されても、前後にスキップしません。

clock_gettime() の Linux のマニュアル ページには、スレッドごとの CPU 経過時間など、利用可能なその他のクロックが記載されています。

于 2010-04-30T20:23:43.887 に答える
9

clock()Windowsと非常によく似ていますGetTickCount()。単位は異なる場合があります。 GetTickCount()ミリ秒を返します。 1秒あたりのティック数をclock()返します。CLOCKS_PER_SECどちらにもロールオーバーする最大値があります(Windowsの場合、約49。7日です)。

GetTickCount()OSの起動時にゼロから開始します。ドキュメントからはclock()、プロセスが開始したときに開始するように見えます。したがって、を使用してプロセス間の時間を比較することはできますがGetTickCount()、を使用してそれを行うことはおそらくできませんclock()

単一のプロセス内で何かが発生している時間を計算しようとしていて、ロールオーバーについて心配していない場合:

const clock_t start = clock();
// do stuff here
clock_t now = clock();
clock_t delta = now - start;
double seconds_elapsed = static_cast<double>(delta) / CLOCKS_PER_SEC;

明確化:clock()壁時計経過時間とプロセッサ時間のどちらを返すかについては不確実性があるようです。私がチェックした最初のいくつかの参照は、実時間と言っています。例えば:

プログラムが起動されてから経過したクロックティック数を返します。

確かにそれは少し曖昧です。MSDNはより明確です:

プロセスの開始から経過した実時間...。

ユーザーdarronは私にもっと深く掘り下げるように説得したので、C標準(ISO / IEC 9899:TC2)のドラフトコピーを見つけました。

...使用されたプロセッサ時間に対する実装の最良の近似値を返します...

私が今まで使用したすべての実装は実時間を与えると思います(これは使用されたプロセッサ時間の概算だと思います)。

結論: さまざまな最適化のベンチマークを実行できるようにコーディングの時間を計ろうとしているのであれば、私の答えは適切です。実際の実時間に基づいてタイムアウトを実装しようとしている場合は、ローカル実装を確認するか、実clock()時間の経過時間を示すために文書化されている別の関数を使用する必要があります。

更新: C ++ 11には、時間と期間をキャプチャするためのさまざまなクロックとタイプを提供する標準ライブラリの部分もあります。標準化されて広く利用可能ですが、AndroidNDKがまだ完全にサポートしているかどうかは明らかではありません。

于 2010-04-29T16:20:38.650 に答える
3

これはプラットフォームに依存するため、ラッパーを作成して各プラットフォームの詳細を実装するだけです。

于 2010-04-29T15:50:28.567 に答える
1

不可能です。C++ 標準と、結果として標準ライブラリは、プロセッサまたは「ティック」について何も知りません。これは、C++0x のスレッド化サポートによって変更される場合と変更されない場合がありますが、少なくとも今のところ、それは不可能です。

于 2010-04-29T15:44:11.747 に答える
1

Android で vblank 割り込み関数 (または hblank) にアクセスできますか? その場合は、タイマー用にグローバルな揮発性変数をインクリメントします。

于 2010-04-29T15:45:16.820 に答える