你怎么编程时间?

时间:2013-09-13 18:38:49

标签: java php c++

这可能听起来像一个奇怪的问题,但是如何在不使用编程语言API的情况下编程时间?时间是一个抽象的概念,如何在不使用预定义函数的情况下编写程序。

我原以为它必须通过处理器计算次数来计算,但是如果每台计算机都有不同的速度性能,你会如何编写代码来迭代时间。

假设编写程序的语言无关紧要,你会怎么做?

编辑:我还应该说,不是使用系统时间,也不是系统中任何预先生成的时间版本

8 个答案:

答案 0 :(得分:6)

通常,OS层向语言运行时提供时间。因此,如果您正在运行在Windows环境中编译的C / C ++程序,那么它正在询问Windows操作系统。如果您正在运行在Linux机器上的JVM中执行的Java程序,那么Java程序将从JVM获取时间,而JVM又从Linux获取它。如果您在浏览器中以JavaScript身份运行,那么Javascript运行时会从浏览器中获取时间,从操作系统获取时间等...

在较低级别,我相信操作系统根据硬件层中经过的时钟周期计算的时间,然后将其与您在BIOS或操作系统中设置的某个根时间进行比较。

更新了更多极客详情:

更加抽象,如果你的计算机是1GHz,这意味着它的cpu每1/10亿( 10 -9 )秒(状态)改变“状态”从+电压到电压和背面的单一过渡。计算机中的所有功能都基于这些转换,因此主板上有硬件定时器可确保这些转换以一致的频率发生。由于这些硬件定时器非常精确,因此它们是对我们使用的日历时间抽象重要事项进行“计算”的基础。

我不是硬件专家,但这是我对计算机体系结构课程和在学校建立基本电路的最好理解。

根据您的修改进行澄清:

程序本身并不“知道”它运行的速度有多慢,所以它本身无法准确跟踪时间的流逝。有些语言可以从操作系统访问“循环计数”和“处理器速度”等信息,因此您可以基于此来近似表示时间的流逝,而无需使用时间API。但考虑到你问题的限制,即使这样也是一种欺骗行为。

答案 1 :(得分:5)

简单地说,你不能。没有纯粹的软件告诉时间的方式。

每台计算机都有许多不同的硬件计时器。这些触发中断后触发,这就是处理器本身可以跟踪时间的方式。没有这些或其他外部来源,您无法跟踪时间。

答案 2 :(得分:5)

主板上的硬件时钟包含一个精确调谐的石英晶体,当精确电流通过时,它以32,768 Hz [2 ^ 15]的频率振动。时钟计算这些振动以标记时间的流逝。系统调用会引用硬件时钟,如果没有硬件时钟,如果执行中的任意点,一秒钟,一天或一年过去,PC就不会有最微弱的想法。

这是系统调用的参考,并试图使用其他任何东西只是一种徒劳的练习,因为其他一切都是计算机的设计,根据它当时正在接收的电压,尽可能快地运行

您可以尝试计算CPU时钟周期,但CPU时钟只是设计为根据输入电压尽可能快地振动,并且可以根据负载要求和电源电压的稳定性而变化供应是。这使得它作为一种测量时间的方法完全不可靠,因为如果你有一个实时监控时钟速度的程序,你会注意到它通常会持续波动+/-几MHz。

即使硬件时钟也不可靠,因为施加到晶体的电压虽然受到严格控制,但仍然是可变的。如果您关闭了NTP服务和/或将其与互联网断开连接,则时间可能会每月或甚至每周漂移几分钟。 NTP服务器参考原子钟,测量物理学的基本属性,即铯原子的振荡。一秒钟目前定义为:

  

9,192,631,770个辐射周期的持续时间对应于铯133原子基态的两个超精细水平之间的过渡。

哦......那也是由电脑测量的。

答案 3 :(得分:2)

在Java中,您会注意到获得时间的最简单方法是

System.currentTimeMillis();

实现为

public static native long currentTimeMillis();

这是一种native方法,它很可能在本机代码中c实现。您的计算机的CPU有internal clock可自行调整。本机调用是对硬件的OS调用以检索该值,可能在某处进行某些软件转换。

答案 4 :(得分:2)

如果没有时钟或对操作系统的引用,您无法测量与世界相关的任何内容。但是你当然可以在内部测量,知道任务是完成任务的1/3或者其他任务。但是,根据系统负载,热量要求的CPU限制,运行的其他程序等,最后的1/3可能需要与前2/3或更长的时间一样长。您可以应用huristics来对自己(仅)加载balanace长时间运行的任务,以便例如,如果相对于线程的任务数量变化以实现期望的性能特性,事情将是平滑的,但PC必须从某个地方获得它的时间。真正便宜的时钟从功率为60hz的事实中获得时间,因此每秒60个周期就会消失。但是hz的实际数量有点变化并且可能在单个方向上不断变化,因此这样的时钟可以非常快速,每天秒数或更多时间不同步。我想用一个相机和一个盒子里的洞,你可以确定太阳是在天空中的某个特定位置并确定时间,但我们在这里的距离相当远。

答案 5 :(得分:1)

我认为你在某种程度上回答了自己的问题:“时间是一个抽象的概念”。所以我认为这取决于你究竟要测量的是什么?如果它的算法效率我们不关心具体的时间测量,那么算法在输入数量(大O符号)方面需要多长时间。是地球在它的轴上旋转需要多长时间或者其中的一小部分,那么显然你需要计算机外部的一些东西来告诉它何时一次迭代开始并且其后一个结束时忽略计算机应该做的cpu时钟漂移很好地告诉你当天的时间是什么。

答案 6 :(得分:1)

但是,我怀疑这可能需要一段时间。

您可以使用计算机被宇宙射线击中的概率。

参考:Cosmic Rays: what is the probability they will affect a program?

您需要创建一个程序来处理计算机内存中的大量数据,从而使其容易受到宇宙射线的侵扰。这些数据在某个时间点会被破坏。 该程序应该能够检查数据的完整性,并标记其数据部分损坏的那一刻。当发生这种情况时,程序还应该能够生成另一个参考帧,例如,给定函数在两次宇宙射线命中之间运行的次数。

然后,这些间隔应记录在数据库中,并在数十亿/万亿/亿次出现后进行平均,从而减少了发生的宇宙射线的随机性。

此时此刻,计算机将能够通过宇宙射线平均命中系数来判断时间。

当然,这是一个过于简单的解决方案。我确信硬件会在这段时间内失效,宇宙射线可以击中可运行的记忆代码区而不是原始数据,宇宙射线可能会因太阳系连续运动通过星系等而发生变化。

然而,确实可能 ...

答案 7 :(得分:0)

校准软件怎么样,就像我们常规手表一样。

有一个程序要求您查询当前时间,然后再检查一段时间(可以与cpu周期相关联或VB程序执行打印语句的次数等)。根据时间差和CPU在此期间完成了多少工作的内部参考,您可以启动时钟。并通过几次时间检查进一步校准。 :-)

相关问题