GVKun编程网logo

java – 为什么System.nanoTime()需要4400纳秒(java为什么要new)

8

如果您想了解java–为什么System.nanoTime()需要4400纳秒的相关知识,那么本文是一篇不可错过的文章,我们将对java为什么要new进行全面详尽的解释,并且为您提供关于Android

如果您想了解java – 为什么System.nanoTime()需要4400纳秒的相关知识,那么本文是一篇不可错过的文章,我们将对java为什么要new进行全面详尽的解释,并且为您提供关于Android BLE:将ScanResult timestampNanos转换为System nanoTime、c# – 为什么System.DateTime结构具有布局类型Auto?、Java random随机数/ seed 种子 / System.nanoTime() 的理解 与 使用、Java System.nanoTime()完全没用吗?的有价值的信息。

本文目录一览:

java – 为什么System.nanoTime()需要4400纳秒(java为什么要new)

java – 为什么System.nanoTime()需要4400纳秒(java为什么要new)

我正在测试一些算法,当我随机忘记删除计时器时,我用纳秒计时器包围,我发现这段代码:

    a = System.nanoTime();
    System.out.println(System.nanoTime() - a);

总是在我的系统上打印4400纳秒.这将是4.4微秒,而这段代码:

    a = System.currentTimeMillis();
    for (int i = 0; i < 1000; i++)
        System.nanoTime();
    System.out.println(System.currentTimeMillis() - a);

打印0

最佳答案
4400纳秒是4.4微秒,或0.0044毫秒.第二个示例将始终打印为零,因为经过的时间远小于一毫秒.然后使用的两个定时器之间存在差异:currentTimeMillis可以调整时钟偏差而nanoTime不能,但我怀疑这是在这里发挥作用.

Android BLE:将ScanResult timestampNanos转换为System nanoTime

Android BLE:将ScanResult timestampNanos转换为System nanoTime

扫描低功耗蓝牙数据包时,我收到设置了ScanResult的ScanCallback.我可以通过result.getTimestampNanos()获得“观察到扫描结果时的设备时间戳”,但是这次与Systems.nanoTime()不一致.有没有办法从一个转换为另一个?

解决方法:

使用以下代码通过使用SystemClock.elapsedRealtime()将getTimestampNanos()转换为系统毫秒数:

long rxTimestampMillis = System.currentTimeMillis() - 
                         SystemClock.elapsedRealtime() +
                         scanResult.getTimestampNanos() / 1000000;

可以轻松地将其转换为Date对象:

Date rxDate = new Date(rxTimestampMillis);

然后,您将获得时间作为字符串:

String sDate = new SimpleDateFormat("HH:mm:ss.SSS").format(rxDate);

c# – 为什么System.DateTime结构具有布局类型Auto?

c# – 为什么System.DateTime结构具有布局类型Auto?

struct System.DateTime及其表单System.DateTimeOffset的结构布局类型设置为“Auto”.这可以看出:
typeof(DateTime).IsAutoLayout    /* true */

要么:

typeof(DateTime).StructLayoutAttribute.Value    /* Auto */

或者从IL中可以看出:

.class public auto ansi serializable sealed beforefieldinit System.DateTime
              ¯¯¯¯

通常用C#编写的struct(即.NET值类型不是枚举)将具有“Sequential”布局(除非已经应用了StructLayoutAttribute以指定其他布局).

我搜索了一些常见的BCL程序集,而DateTime和DateTimeOffset是我在这个布局中发现的唯一公开的可见结构.

有没有人知道为什么DateTime有这个不寻常的结构布局?

解决方法

这将需要投机,这个决定是在很久以前,就在.NET 1.0发布之前. System.DateTime中的属性最多只是一个微型优化,在.NET代码中并不罕见.这有点合适,结构只有一个字段,所以布局永远不会有任何问题.内部CustomAttribute结构体的结构可能由同一个程序员完成.无论如何,非托管代码都不会看到它们.

System.DateTimeOffset的执行时间稍晚,几乎肯定是一个复制粘贴错误.

那个程序员已经离开了,CLR没有理由重新排列顺序版本的布局.当自动布局重新排列时,如果结构体包含足够大以适合另一个小字段的字段之间的填充,就会发生.不是DateTimeOffet的情况.

当您提交DateTimeOffset的反馈报告时,您有一些可能会让Microsoft上师注意这一点.这是错误的afaik.发布到connect.microsoft.com

Java random随机数/ seed 种子 / System.nanoTime() 的理解 与 使用

Java random随机数/ seed 种子 / System.nanoTime() 的理解 与 使用

伪随机(preundorandom):通过算法产生的随机数都是伪随机!!

只有通过真实的随机事件产生的随机数才是真随机!!比如,通过机器的硬件噪声产生随机数、通过大气噪声产生随机数

 

Random生成的随机数都是伪随机数!!!

是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性) 

Random类拥有两个构造方法,用于实现随机数生成器:

Random( ) 构造一个随机数生成器,种子是  与nanoTime异或后的值。每遍输出的多个序列均不同。随机性更强。
Random(long seed) 用种子seed构造一个随机数生成器,种子是给定的。每遍输出的多个序列均相同。

 

 

/**
  • * Creates a new random number generato

    Java System.nanoTime()完全没用吗?

    Java System.nanoTime()完全没用吗?

    如在x86系统上的博客文章“ 当心 Java中的System.nanoTime()”中所述,Java的System.nanoTime()使用CPU专用计数器返回时间值。现在考虑以下情况,我用它来衡量通话时间:

    long time1= System.nanoTime();foo();long time2 = System.nanoTime();long timeSpent = time2-time1;

    现在,在多核系统中,可能是在测量了time1之后,将该线程调度到了另一个计数器,该计数器的计数器小于以前的CPU的计数器。因此,我们可以在time2中获得一个小于 time1的值。因此,我们将在timeSpent中得到一个负值。

    考虑到这种情况,System.nanotime暂时还没有用吗?

    我知道更改系统时间不会影响纳米时间。那不是我上面描述的问题。问题在于,每个CPU自打开以来都会保留一个不同的计数器。与第一个CPU相比,该计数器在第二个CPU上可以更低。由于操作系统可以在获取time1之后将线程调度到第二个CPU,因此timeSpent的值可能不正确,甚至为负数。

    答案1

    小编典典

    从当时的Sun JDK在当时的操作系统上运行的观点来看,该答案写于2011年。那是很久以前的事!列文托夫的答案提供了最新的观点。

    该帖子是错误的,并且nanoTime很安全。Sun的实时与并发专家David Holmes对该博文进行了评论,并链接到该博文。它说:

    使用QueryPerformanceCounter / QueryPerformanceFrequency API实现System.nanoTime()。QPC使用的默认机制由硬件抽象层(HAL)确定。版本。例如,由于TSC无法在SMP系统中的不同处理器上同步的问题,Windows XP Service Pack 2更改了使用电源管理计时器(PMTimer)而不是处理器时间戳计数器(TSC)的功能。会根据电源管理设置而变化(并因此而变化与经过时间的关系)。

    因此,在Windows上,直到WinXP SP2之前,这都是一个问题,但现在不是。

    我找不到涉及其他平台的第二部分(或更多部分),但是该文章的确包含了Linux已经以相同的方式遇到并解决了相同问题的注释,并带有指向clock_gettime(CLOCK_REALTIME)的常见问题的链接。,其中说:

    在所有处理器/内核中,clock_gettime(CLOCK_REALTIME)是否一致?(是否重要?例如ppc,arm,x86,amd64,sparc)。
    它应该或被认为是越野车。

    但是,在x86 / x86_64上,可能会看到未同步或可变的频率TSC导致时间不一致。2.4内核确实没有针对此的保护措施,而早期的2.6内核在这里也不是很好。从2.6.18版开始,用于检测此错误的逻辑会更好,我们通常会退回到安全的时钟源。

    ppc始终具有同步的时基,因此这不成问题。

    因此,如果Holmes的链接可以被理解为暗示着nanoTime调用clock_gettime(CLOCK_REALTIME),那么从x86上的内核2.6.18开始,并且始终在PowerPC上,它是安全的(因为IBM和Motorola与Intel不同,实际上知道如何设计微处理器)。

    遗憾的是,没有提到SPARC或Solaris。当然,我们不知道IBM JVM做什么。但是现代Windows和Linux上的Sun JVM可以实现这一目标。

    编辑:这个答案是基于它引用的来源。但是我仍然担心这实际上可能是完全错误的。一些最新的信息将非常有价值。我刚找到一个指向Linux时钟的四年更新文章的链接,该文章可能会有用。

    答案2

    小编典典

    使用Spring EL:

    @Value("#{''${my.list.of.strings}''.split('','')}") private List<String> myList;

    假设使用以下内容正确加载了属性文件:

    my.list.of.strings=ABC,CDE,EFG

    关于java – 为什么System.nanoTime()需要4400纳秒java为什么要new的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android BLE:将ScanResult timestampNanos转换为System nanoTime、c# – 为什么System.DateTime结构具有布局类型Auto?、Java random随机数/ seed 种子 / System.nanoTime() 的理解 与 使用、Java System.nanoTime()完全没用吗?的相关知识,请在本站寻找。

    本文标签:

    上一篇GQL仅适用于Python项目而不适用于Java?

    下一篇java System.out.println()奇怪的行为长字符串