【问题标题】:Handle Multiple Access to dll function处理对 dll 函数的多次访问
【发布时间】:2014-06-05 23:43:29
【问题描述】:

在使用多线程访问 dll 函数时遇到问题。 我正在使用我自己编译的 dll 。我使用多个 java 线程从 java (JNA) 调用 dll 函数。 我正在处理的操作是关于图像处理的。 使用这种方法,我确实观察到了一些小的帧生成速度损失。 我想知道是不是因为线程访问了dll函数。

这是我正在使用的功能:

__declspec(dllexport) int iterate(double z_r,double z_i,double c_r,double c_i,double maxIteration){
double tmp;
int i=0;
while(z_r*z_r + z_i*z_i < 4 && i <maxIteration){
    tmp = z_r;
    z_r = z_r*z_r - z_i*z_i + c_r;
    z_i = 2*z_i*tmp + c_i;
    i++;
}
return i;
}

【问题讨论】:

  • 您正在观察“一些小的帧生成速度损失”。与什么相比?
  • 首先该函数是完整的Java

标签: java c multithreading dll wrapper


【解决方案1】:

问题可能不在于您从多个线程访问该函数,而应该是外部访问本身。我不知道您的值有多大,例如 maxIteration,但在我看来,这段代码 sn-p 运行时间不长,但经常

尤其是在使用 JNA 时,调用此方法时可能会产生一些严重的开销。因此,在返回 Java(并再次调用外部方法......)之前,您应该尝试一次做更多的工作。这样,您在 C 中可能拥有的性能优势可以弥补开销。

话虽如此,但不能肯定地说用 C 语言编写的这种方法会比用 Java 编写的方法运行得更快。目前手头没有引用(我会尝试找到一个),我在几周前的一次讲座中听说,Java 在简单的算术运算方面应该是惊人的快——这是你的方法唯一能做的事情.您还应该在编译 C 库时检查是否启用了编译器优化。

编辑:Wikipedia article 声明 Java 具有类似于用 C++ 编写的此类程序的算术运算性能。所以性能优势可能很小,我之前提到的开销可能最终决定。

【讨论】:

  • 哦,对了,我想确实是这样,我大部分时间都必须做 10*10^6 次这个单次操作
  • maxIteration 大多数时候是 1000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多