2

これは奇妙な質問のように聞こえるかもしれませんが、プログラミング言語の API を使用せずに時間をプログラムするにはどうすればよいでしょうか? 時間は非常に抽象的な概念です。時間の定義済み関数を使用せずにプログラムを作成するにはどうすればよいでしょうか。

プロセッサの計算回数で計算する必要があると思っていましたが、すべてのコンピューターの速度パフォーマンスが異なる場合、どのようにコードを記述して時間を反復するのでしょうか。

プログラムが書かれている言語が問題ではないと仮定すると、どのようにこれを行いますか?

編集:システム時間、またはシステムから事前に生成されたバージョンの時間を使用しないことも言う必要があります

4

7 に答える 7

8

通常、時間は OS レイヤーによって言語ランタイムに提供されます。そのため、Windows 環境でコンパイルされた C/C++ プログラムを実行している場合、Windows OS に時間を尋ねています。Linux ボックスの JVM で実行されている Java プログラムを実行している場合、Java プログラムは JVM から時刻を取得し、JVM は Linux から時刻を取得します。ブラウザーで JavaScript として実行している場合、Javascript ランタイムはブラウザーから時間を取得し、ブラウザーは OS から時間を取得します。

下位レベルでは、OS の時間はハードウェア層の経過クロック サイクルに基づいており、BIOS または OS で設定したルート時間と比較されていると思います。

いくつかのオタクの詳細で更新されました:

さらに抽象化すると、コンピュータが 1 GHz の場合、それは CPU が 1/1Billion( 10 -9 ) 秒ごとに「状態」を変更することを意味します (+ 電圧から - 電圧への 1 回の遷移とその逆の期間)。コンピュータ内のすべてがこれらの遷移に基づいているため、マザーボードにはハードウェア タイマーがあり、これらの遷移が一定の頻度で発生するようにします。これらのハードウェア タイマーは非常に正確であるため、使用する Calendar 時間の抽象化に関する重要な時間を「カウント」するための基礎となります。

私はハードウェアの専門家ではありませんが、これは、コンピューター アーキテクチャの授業や学校での基本的な回路の構築から得た最良の理解です。

あなたの編集に基づいて明確にする:

プログラムは、実行速度が遅いか速いかを本質的に「認識」していないため、それ自体で時間の経過を正確に追跡する方法はありません。一部の言語では、OS から「サイクル カウント」や「プロセッサ速度」などの情報にアクセスできるため、時間 API を使用しなくても、それに基づいて時間の経過をある程度表現できます。しかし、それでさえ、あなたの質問の制約を考えると一種の不正行為です.

于 2013-09-13T18:47:54.980 に答える
5

簡単に言えば、できません。時間を伝える純粋なソフトウェアの方法はありません。

すべてのコンピューターには、多数の異なるハードウェア タイマーがあります。これらは、トリガーされると割り込みを発生させます。これにより、プロセッサ自体が時間を追跡できます。これらまたはその他の外部ソースがなければ、時間を追跡することはできません。

于 2013-09-13T18:43:39.273 に答える
2

時計や OS への参照がなければ、世界の外側に関連するものを測定することはできません。ただし、もちろん、タスクが完了した方法の 1/3 であることを内部的に測定することもできます。ただし、システム負荷、温度要件による CPU スロットリング、実行中の他のプログラムなどによっては、最後の 1/3 が最初の 2/3 よりも長くかかる場合があります。ヒューリスティックを適用して、長時間実行されるタスクを自分自身に対してロードすることができます (のみ)。これにより、たとえば、スレッドに関連するタスクの数が変化して目的のパフォーマンス特性を達成する場合に物事がスムーズになりますが、PC はどこかから時間を取得する必要があります。本当に安価な時計は、電力が 60hz であるという事実から時間を取得するため、1 秒あたり 60 サイクルごとに経過します。しかし、hz の実際の数は少し変化し、常に一方向に変化する可能性が高いため、そのような時計はかなり速く、1 日あたり数秒またはそれ以上同期しなくなります。カメラと箱の穴を使えば、太陽がいつ空の特定の位置にあったかを判断し、その方法で時間を判断できると思いますが、ここではかなり遠く離れています.

于 2013-09-13T19:54:54.683 に答える
2

Java では、時間を取得する最も簡単な方法は次のとおりです。

System.currentTimeMillis();

これは次のように実装されます

public static native long currentTimeMillis();

これは、おそらくnativeネイティブ コードで実装されるメソッドです。cコンピュータの CPU には、自己調整可能な内部クロックがあります。ネイティブ呼び出しは、その値を取得するためのハードウェアへの OS 呼び出しであり、おそらくどこかで何らかのソフトウェア変換を行っています。

于 2013-09-13T18:47:16.897 に答える