Centos 7,System.nanoTime 比 Windows 慢 400 倍

2024-02-18

我看过并读过关于为什么 System.nanoTime() 在某些操作系统上比其他操作系统慢的文章,但是我从未见过任何东西可以解释我现在看到的差异。我正在使用 JMH 运行这个基准测试。 (注意:它也使用 System.nanoTime())

@Benchmark
public long systemNanoTime() {
    return System.nanoTime();
}

在 Windows 10 上,这大约需要 25 纳秒。

在 Centos 7、Linux 3.10 上,测得耗时约为 10293 ns。

这是在同一台机器上,Intel(R) Core(TM) i7-7820X CPU @ 3.60GHz

是否有选项可以更改 JDK 获取系统时钟的方式?


编辑:根据托德提供的链接,tsc 似乎不可用

# more /sys/devices/system/clocksource/clocksource0/*
::::::::::::::
/sys/devices/system/clocksource/clocksource0/available_clocksource
::::::::::::::
hpet acpi_pm 
::::::::::::::
/sys/devices/system/clocksource/clocksource0/current_clocksource
::::::::::::::
hpet

表演后

echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource

延迟有所改善,但仍然很差,延迟为 1,816 ns。

我试图找出TSC时钟源是否可以添加到Centos,但还没有成功。


编辑:进一步挖掘

# dmesg | grep -i tsc
[    0.000000] tsc: Detected 3600.000 MHz processor
[    0.058602] TSC deadline timer enabled
[    0.065868] TSC synchronization [CPU#0 -> CPU#1]:
[    0.065870] Measured 679995254538 cycles TSC warp between CPUs, turning off TSC clock.
[    0.065874] tsc: Marking TSC unstable due to check_tsc_sync_source failed
[  125.451480] Override clocksource tsc is not HRT compatible. Cannot switch while in HRT/NOHZ mode

根据 @apangin 的建议,我按照此页面添加最新版本的 centos 替代存储库

http://elrepo.org/tiki/tiki-index.php http://elrepo.org/tiki/tiki-index.php

然后按照此处的进一步说明进行操作

https://www.howtoing.com/install-upgrade-kernel-version-in-centos-7/ https://www.tecmint.com/install-upgrade-kernel-version-in-centos-7/

安装并重新启动后

# $ dmesg | grep -i tsc
[    0.001000] tsc: Detected 3600.000 MHz processor
[    0.001000] [Firmware Bug]: TSC ADJUST: CPU0: -2100392876408 force to 0
[    0.046075] TSC deadline timer enabled
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU1: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU2: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU3: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU4: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU5: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU6: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU7: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU8: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU9: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU10: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU11: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU12: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU13: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU14: 0
[    0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU15: 0
[    1.337843] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x6c1bafbc2ab, max_idle_ns: 881591058496 ns
[    2.353636] clocksource: Switched to clocksource tsc

表明内核正在针对固件错误进行调整。

再次运行测试,使用 System.nanoTime() 得到的平均延迟为 40 ns,提高了 260 倍。这也意味着使用此衡量标准的基准更有意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Centos 7,System.nanoTime 比 Windows 慢 400 倍 的相关文章

随机推荐

  • 我们可以在 Firestore 中查询多深? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我只是在寻找在 Firestore 上设计数据库的答案 我有根集合的 4 级和 5 级子集合 在这个级
  • Azure 发布管道错误:无法获取 Kudu 应用程序设置。错误:服务暂时不可用(代码:503)

    我有一个 Azure DevOps 发布管道 它将容器部署到 Azure 中的应用程序服务 当我运行它时 部署容器的任务失败并显示消息 2020 10 23T16 12 20 8516547Z 错误 错误 无法获取 Kudu 应用程序设置
  • 使用 Hudson 发布 NUnit 测试结果报告时出现问题

    我在 Hudson 和 NUnit 测试方面遇到问题 当尝试发布 NUnit 的测试结果报告时 Hudson 中的选项 即 发布 NUnit 测试结果报告 会产生问题 我无法提供作业工作区文件夹下已创建的 XML 文件的路径 当我设置文件的
  • 如何配置 persistence.xml 提供者标签

    嘿 我正在学习这些东西 我并没有真正理解所有内容 而且我有一个问题 我不知道在 persistence xml 的提供者标签中写什么 这是我的 persistence xml 和 pom xml 文件 pom xml
  • 如何在运行时将图像加载到WPF?

    在运行时将图像加载到 WPF 窗口似乎相当复杂 Image image image new Uri Bilder sas png UriKind Relative Source new BitmapImage image 我正在尝试这段代码
  • 带百分比标签的 Ggplot 堆积条形图

    I am trying to do a stacked bar plot based on count but with the labels showing the percentage on the plot I have produc
  • 如何在 C++ 中加载共享对象?

    我有一个共享对象 so Windows dll 的 Linux 等效项 我想将其导入并与我的测试代码一起使用 我确信这不是那么简单 但这就是我想做的事情 include headerforClassFromBlah h int main l
  • 如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

    我使用的是 QuickGraph 3 6 版 我找到了函数 SetRootVertex 但没有 SetTagretVertex 我需要这个 因为我正在巨大的图中搜索短路径 这会大大加快程序速度 有问题的类是 DijkstraShortest
  • C++ 错误:基函数受保护

    我想知道为什么下面的代码不能编译 class base protected typedef void base function type const void function impl const error void base fun
  • 优化字符串连接的聚合[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 Update 对于那些有幽默感的人 您可以假设无论传递给它什么函数 聚合仍然会产生正常结果 包括在被优化的情况下 我编写这个程序是为了构建一
  • DataContract,默认 DataMember 值

    有没有办法在反序列化期间选择不在 xml 文件中的属性的默认值 If the mAgexml 文件中不存在属性 我想使用默认值 18 这可能吗 DataContract public class Person public Person D
  • 如何将触摸事件从 UIView 传递到其下方的 UIView?

    一个简单的问题 但我找不到解决方案 我有 2 个 UIView 一个在同一个父视图中 一个在另一个之上 都有GestureRecognizers在它们上 但只有最顶层正在接收事件 我怎样才能让最上面的视图将他获得的所有手势传递给它下面的其他
  • Golang MySQL 错误 - packet.go:33: 意外的 EOF

    我将整个代码库从 PHP 切换到 Go 在运行的几个进程中 我随机收到此错误 mysql 2016 10 11 09 17 16 packets go 33 unexpected EOF 这是我的 db 包 它处理与数据库的所有连接 pac
  • 有人可以向我解释一些 helm 的用例吗?

    我目前正在使用 kubernetes 并且遇到了 helm 假设我不喜欢用与我的应用程序无关的进程 感染 我的 kubernetes 集群 但如果它有益的话 我很乐意接受 所以我做了一些研究 但我仍然找不到任何使用我的 yaml 描述符和
  • ASP.Net URL 编码

    我正在 ASP net 中实现 URL 重写 但我的 URL 给我带来了很多问题 URL 是根据部门和类别的数据库生成的 我希望员工能够使用任何合适的特殊字符将项目添加到数据库中 而不会破坏网站 我在构建 URL 之前对数据进行编码 有几个
  • Sphinx .net 实现

    是否可以在 net MSSQL 应用程序中实现Sphinx 全文搜索 如果是这样 任何帮助如何实现相同的 一个小的描述将会有很大帮助 我们正在使用 SphinxConnector NET http www sphinxconnector n
  • Zend Framework:需要ACL的典型示例

    有人可以指导我 ACL 的典型实施示例吗 就像 管理员 可以访问 管理 模块 用户 可以访问 用户模块 访客可以访问 打开 页面 我可以把我的 ACL 贴给你 它由三个元素组成 acl ini ACL 控制器插件 My Controller
  • Big O:如何根据外部 for 循环确定 for 循环增量的运行时间?

    我有以下算法 运行时复杂度为 O N 2 但我想对其有更深入的了解 而不是仅仅记住常见的运行时 分解和分析它的正确方法是什么i 1考虑在内层 for 循环中吗 void printunorderedPairs int array for i
  • 通过kwargs更新模型django

    我如何传递一个包含字段的字典来更新 Django 模型 这不是创建一个对象 而是更新它 example obj Object objects create index id fields 只要PK相同 现有的行就会被覆盖 obj Objec
  • Centos 7,System.nanoTime 比 Windows 慢 400 倍

    我看过并读过关于为什么 System nanoTime 在某些操作系统上比其他操作系统慢的文章 但是我从未见过任何东西可以解释我现在看到的差异 我正在使用 JMH 运行这个基准测试 注意 它也使用 System nanoTime Bench