0

記事自体はこちら: https://developer.apple.com/library/mac/#qa/qa1398/_index.html

mach_absolute_time の呼び出しの直後に、getpid() の呼び出しがあります。ドキュメントによると、この関数は呼び出しプロセスの ID を返します。なぜ is がここにあるのか、時間の測定の文脈で不正確な結果の作者が何を話しているのか理解できません。

これが私が疑問に思っているコードです:

uint64_t GetPIDTimeInNanoseconds(void)
{
    uint64_t        start;
    uint64_t        end;
    uint64_t        elapsed;
    uint64_t        elapsedNano;
    static mach_timebase_info_data_t    sTimebaseInfo;

    // Start the clock.

    start = mach_absolute_time();

    // Call getpid. This will produce inaccurate results because 
    // we're only making a single system call. For more accurate 
    // results you should call getpid multiple times and average 
    // the results.

    (void) getpid();

    // Stop the clock.

    end = mach_absolute_time();

    // Calculate the duration.

    elapsed = end - start;

    // Convert to nanoseconds.

    // If this is the first time we've run, get the timebase.
    // We can use denom == 0 to indicate that sTimebaseInfo is 
    // uninitialised because it makes no sense to have a zero 
    // denominator is a fraction.

    if ( sTimebaseInfo.denom == 0 ) {
        (void) mach_timebase_info(&sTimebaseInfo);
    }

    // Do the maths. We hope that the multiplication doesn't 
    // overflow; the price you pay for working in fixed point.

    elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;

    return elapsedNano;
}
4

1 に答える 1

0

著者は、正確なタイミング測定を行う方法を示すサンプル コードを提供しています。彼/彼女は測定する関数呼び出しの例として getpid() を単に使用したと思います (関数名は GetPIDTimeInNanoseconds です)。

不正確なコメントに関しては、著者は、より高い精度を得るために、複数の読み取り値を取得して結果を平均することを提案していると思います. たとえば、時計を一度開始して停止する代わりに、おそらく次のようなことができます。

int numberOfReadings = 5;
uint64_t elapsedTimeAccumulated = 0;
for (int i = 0; i < numberOfReadings; i++) {
    start = mach_absolute_time();
    (void) getpid();
    end = mach_absolute_time();
    elapsedTimeAccumulated += end - start;
}
// Average
elapsed = elapsedTimeAccumulated / numberOfReadings;
于 2013-11-06T12:29:54.713 に答える