0

ライブラリの依存関係が x86-64 のみであるため、現在ユニバーサル バイナリとしてコンパイルできない macOS x86-64 アプリケーションを作成しています。

このアプリは、Apple Silicon mac で arm64 として実行されている他のプロセスとやり取りする必要があり、その際、 によって返されるように、生のティックでシステム クロックの値を取得する必要がありますmach_absolute_time()

ただし、Apple Silicon mac ではmach_absolute_time()、ネイティブの arm64 アプリから呼び出された場合と、Rosetta 2 の x86-64 アプリから呼び出された場合とで動作が異なります。

Intel Mac ではmach_absolute_time()、システム クロックをナノ秒単位でmach_timebase_info()返し、ナノ秒とクロック ティックの 1:1 の比率を返します。

Apple Silicon mac では、システム クロックの単位がナノ秒ではなくなったためmach_timebase_info()、1:1 の比率が返されません。(私の M1 Mac Mini では、比率は 125:3 です。)

ただし、Rosetta 2 で実行されている x86-64 アプリは、Intel プロセッサで取得したのと同じ値を取得します。これは 1:1 の比率でmach_absolute_time()、ナノ秒単位で値を返します。

mach_absolute_time()x86-64 アプリが arm64 プロセスから呼び出されたかのように実際の値を取得する必要があるため、これは私にとって問題です。

これまでのところ、私はこれを行う方法を見つけていません。私が知っているすべての時計関連の関数は、Rosetta 2 で呼び出されたときに「偽の」値を返します。私が考えることができる唯一の解決策は、ユニバーサル バイナリである実行可能ファイルをアプリにバンドルし、アプリから呼び出して、それを取得することです。 arm64 としてネイティブに実行されているタイムベース情報を取得し、値を返します。しかし、それは私が望むよりもかなり重い解決策です.

Rosetta 2 で実行されている x86-64 アプリで実際のシステム クロックのタイムベースを取得する方法はありますか?

4

1 に答える 1