草庐IT

java - 如何以精确控制的执行时间启动 Java 程序?

coder 2023-05-18 原文

据我所知,JVM 在启动 Java 应用程序之前会为其分配一些 RAM,并且该内存可以在启动之前由用户控制。但是当我启动一个应用程序时,它每次执行的时间都不同。

这是一个非常简单的 for 循环示例:

package timespent;

public class Main {

    public static void main(String[] args) {

        long startTime = System.nanoTime();

        int j = 0;

        for (int i = 0; i < 1.E6; i++) {
            j = i + 1;
        }

        long endTime = System.nanoTime();

        long duration = (endTime - startTime);

        System.out.println("duration = " + duration);
    }
}

它打印出不同的结果:

duration = 5720542
duration = 7331307
duration = 7737946
duration = 6899173

假设我希望它精确地执行 10,000,000 纳秒或 10 毫秒。

我想要什么?

我希望以准确的时间执行 java 应用程序。

我为什么需要这个?

当我启动一个应用程序时,我想在它加载所有组件之前在应用程序启动窗口上显示准确的执行时间。

我想这是一种 CPU 操作,我想知道它是否可能。

Q1:在Java中可以吗?
Q2:如果在 Java 中是不可能的,那么有没有办法通过访问 OS native 方法来实现这一点。例如通过优先考虑 Java 应用程序或其他方式?
Q3:如何将应用程序的状态保存到文件并加载到内存中?

最佳答案

您的时间测量存在多种不确定性来源。所有这些来源不仅会影响您的测量,而且不确定的是运行时本身。不确定性的来源包括:

  • 缓存使用情况(内存的哪些部分被缓存在 CPU 中)。 CPU 执行后台任务可以将数据从缓存中逐出。

  • 内存布局(内存是否直接连接到正在执行的 CPU 内核?)。这可能会随着时间的推移而改变,因为您的进程可能随时迁移到另一个核心。

  • 软件中断(您的操作系统抢占您的进程以运行不同的进程)。在安静的机器上运行可以在一定程度上缓解,但不能保证您不会被打断。

  • 热节流(您的 CPU 认为它太热并降低其时钟速度)。除非您准备在具有固定时钟速度的嵌入式处理器上工作,否则您实际上无能为力。

  • 硬件中断(您的网络连接器从 Internet 上的另一台计算机接收到一些数据)。无论如何,您对何时发生都没有影响。

  • 不可预测的延迟(您正在从磁盘读取一些数据,但首先,磁盘必须等到数据到达读取头以下)。当您一遍又一遍地重复完全相同的操作时,这可能会遵循模式,但是一旦您获得不相关的硬件中断,这可能会导致 1/7200 rpm * 60 s/min = 8.3 ms 的意外延迟.

  • 垃圾收集(你问的是 Java,所以你有一个 GC 在后台运行)。即使是最好的、最现代的垃圾收集器也不能完全避免不时地停止世界。即使它们没有停止世界,它们仍然在后台运行,通过缓存、内存放置和软件中断引入运行时噪音。

这些可能是最重要的来源,可能还有其他来源。关键是,您的进程绝不单独在机器上。除非您在没有操作系统的情况下运行并禁用所有硬件中断,否则您只需要忍受这样一个事实,即您的运行时间会因执行而异,而且根本无法解决这个问题。

关于java - 如何以精确控制的执行时间启动 Java 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47196129/

有关java - 如何以精确控制的执行时间启动 Java 程序?的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  7. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  8. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  9. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐