使用JNI有可能提高性能吗?

 2023-01-20    292  

问题描述

一两年前,我创建了一个用Java编写的程序来模拟N体问题.
最近,我已经获得了疯狂的身份,将该程序重写为分布式程序,以便能够以更好的准确性模拟更大的群众.

对旧程序进行分析,如预期的那样,大约90%的程序用于计算浮点类型值.如果我正确记得C/C ++更快,那么Java在执行算术操作时,尤其是Float类型计算.

使用JNI有可能提高性能吗?

无论如何,这是实际问题:)

通过使用JNI,我可以期望速度的提高与C/C ++编写的程序一样(用于计算),还是JVM会减慢其速度?

推荐答案

大多数浮点操作在Java中大约需要1 ns,因此我不确定您期望它们在C ++中的速度.

但是,jni的电话通常需要大约30 ns,因此,除非您每次通话执行很多浮点操作,否则您的费用将超过节省.

正如以下微基准测试所暗示的那样,一旦代码加热,每个操作都是次数下的.

如果您希望它能更快,则可以使用多个内核并使其更快4倍或更快.

public static void main(String[] args) throws Exception {
    int length = 200000;
    double[] a = fill(new double[length]);
    double[] b = fill(new double[length]);
    double[] c = fill(new double[length]);
    double[] x = new double[length];

    for (int i = 0; i < 10; i++)
        testTime(length, a, b, c, x);
}

private static void testTime(int length, double[] a, double[] b, double[] c, double[] x) {
    long start = System.nanoTime();
    for (int i = 0; i < length; i++)
        x[i] = a[i] * b[i] + c[i];
    long time = System.nanoTime() - start;
    System.out.printf("Average time per double operation was %.1f ns%n", time / 2.0 / length);
}

private static double[] fill(double[] doubles) {
    for (int i = 0; i < doubles.length; i++)
        doubles[i] =  Math.random();
    return doubles;
}

打印

Average time per double operation was 10.9 ns
Average time per double operation was 17.9 ns
Average time per double operation was 1.7 ns
Average time per double operation was 1.0 ns
Average time per double operation was 0.9 ns
Average time per double operation was 0.8 ns
Average time per double operation was 0.9 ns
Average time per double operation was 0.8 ns
Average time per double operation was 1.0 ns
Average time per double operation was 0.9 ns

其他推荐答案

绩效关注的最重要的事情是测试和替补.您听说C ++在浮点上比Java更好.好的,情况.但是,如果没有替补席表明这种实际差异,这是不值得一分钱的.这可能真的是错误的.

实际上,现代Java使用JIT.那是什么 ?好吧,我们都知道Java使用字节码,并且可以解释字节码.这是真实的.实际上,使用大量使用的代码是在为您的平台优化的本机代码时即时编译的.通过使用执行统计信息,JIT甚至可以在C/C ++中执行优化.

现在,Java和JVM被广泛接受为一个非常快速有效的平台.人们开始真正成功地将其真正使用.部署在网格上也更容易.

最近的基准测试倾向于显示类似于C/C ++的性能(对于 http:http://blogs. oracle.com/amurillo/entry/java_vs_c )

因此,您会从JNI和仅移植到C ++.我会说不,或者很少的收益. (但是如果您想确定,请再次测试).而无需优化,C ++版本可以慢.

您是否可以使用JNI和使用优化的汇编代码获得大量改进(包括请参见说明)?绝对是,如果您以正确的方式做.它需要大量的长凳,专业知识和时间.

其他推荐答案

我认为这个答案: jni performance
在这里也适用.如果您每次表现都会遭受几次计算,请多次打电话给JNI.如果您致电JNI进行重计计算,则C优化代码的执行速度应更快.

以上所述是小编给大家介绍的使用JNI有可能提高性能吗?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26099.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。