王桑的一天 2023-02-08 11:28 采纳率: 75%
浏览 30
已结题

Java 中使用 jna 调用 dll 函数,性能很差

// mydll.c
__declspec(dllexport) double test(double a, double b)
{
    return a / b - 1;
}
// test.java

import com.sun.jna.Native;
import com.sun.jna.Library;

public class test {
    public interface DLL extends Library {
        DLL INSTANCE = (DLL)Native.load("mydll", DLL.class);
        double test(double a, double b);
    }

    public static void main(String[] args) {        
        DLL dll = DLL.INSTANCE;
        long st = System.nanoTime();
        dll._conformance(3.234, 4.234);
        System.out.println("耗时: " + String.valueOf(System.nanoTime() - st));
    }
}
// 耗时: 6795340

import time
from ctypes import *

dll = CDLL("mydll.dll")
dll.test.restype = c_double

def invoke():
    st = time.time_ns()
    dll.test(c_double(3.234), c_double(4.234))
    print("耗时: ", time.time_ns() - st)

invoke()
# 耗时: 0

为什么 jna 调用一次 dll函数,都是 毫秒级的?怎么样能达到 python 那样的调用速度?

  • 写回答

4条回答 默认 最新

  • 踢足球的阿坤 2023-02-08 13:09
    关注

    JNA 调用 dll 函数是毫秒级的,这主要是因为它将调用转换为 Java Native Interface (JNI)调用,以帮助实现编程语言之间的互操作性。它将功能转换成,当调用dll函数时,它会将操作放入JNI调用并完成,从而大大缩短了调用时间。

    要达到与Python一样的调用速度,需要采用类似JNI这样的库,以帮助提高调用速度。此外,可以考虑使用多线程来调用dll函数,充分利用CPU的资源,以便更好地使用现有计算机资源,进一步提高调用速度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月17日
  • 已采纳回答 2月9日
  • 创建了问题 2月8日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来